couchbase 4.2.1 → 4.2.2
Sign up to get free protection for your applications and to get access to all the features.
- package/CMakeLists.txt +1 -0
- package/deps/couchbase-cxx-client/.gitmodules +3 -0
- package/deps/couchbase-cxx-client/.idea/misc.xml +1 -0
- package/deps/couchbase-cxx-client/.idea/vcs.xml +1 -0
- package/deps/couchbase-cxx-client/CMakeLists.txt +11 -1
- package/deps/couchbase-cxx-client/README.md +3 -3
- package/deps/couchbase-cxx-client/cmake/CompilerWarnings.cmake +4 -1
- package/deps/couchbase-cxx-client/cmake/VersionInfo.cmake +13 -1
- package/deps/couchbase-cxx-client/cmake/build_version.hxx.in +1 -0
- package/deps/couchbase-cxx-client/core/cluster.hxx +15 -5
- package/deps/couchbase-cxx-client/core/impl/build_deferred_query_indexes.cxx +17 -6
- package/deps/couchbase-cxx-client/core/impl/cluster.cxx +1 -1
- package/deps/couchbase-cxx-client/core/impl/collection_query_index_manager.cxx +93 -0
- package/deps/couchbase-cxx-client/core/impl/configuration_profiles_registry.cxx +11 -0
- package/deps/couchbase-cxx-client/core/impl/create_query_index.cxx +119 -0
- package/deps/couchbase-cxx-client/core/impl/drop_query_index.cxx +108 -0
- package/deps/couchbase-cxx-client/core/impl/get.cxx +1 -1
- package/deps/couchbase-cxx-client/core/impl/get_all_query_indexes.cxx +76 -0
- package/deps/couchbase-cxx-client/core/impl/query.cxx +5 -7
- package/deps/couchbase-cxx-client/core/impl/watch_query_indexes.cxx +168 -0
- package/deps/couchbase-cxx-client/core/io/mcbp_session.cxx +15 -1
- package/deps/couchbase-cxx-client/core/logger/configuration.hxx +3 -0
- package/deps/couchbase-cxx-client/core/logger/level.hxx +21 -0
- package/deps/couchbase-cxx-client/core/logger/logger.hxx +4 -6
- package/deps/couchbase-cxx-client/core/meta/CMakeLists.txt +4 -2
- package/deps/couchbase-cxx-client/core/meta/features.hxx +31 -0
- package/deps/couchbase-cxx-client/core/meta/version.cxx +67 -5
- package/deps/couchbase-cxx-client/core/meta/version.hxx +12 -1
- package/deps/couchbase-cxx-client/core/metrics/CMakeLists.txt +4 -1
- package/deps/couchbase-cxx-client/core/metrics/logging_meter.cxx +46 -5
- package/deps/couchbase-cxx-client/core/metrics/logging_meter.hxx +10 -26
- package/deps/couchbase-cxx-client/core/operations/document_get_projected.cxx +3 -2
- package/deps/couchbase-cxx-client/core/operations/document_query.cxx +10 -12
- package/deps/couchbase-cxx-client/core/operations/document_query.hxx +1 -3
- package/deps/couchbase-cxx-client/core/operations/management/query_index_build.cxx +8 -14
- package/deps/couchbase-cxx-client/core/operations/management/query_index_build.hxx +2 -1
- package/deps/couchbase-cxx-client/core/operations/management/query_index_build_deferred.hxx +15 -8
- package/deps/couchbase-cxx-client/core/operations/management/query_index_create.cxx +7 -14
- package/deps/couchbase-cxx-client/core/operations/management/query_index_create.hxx +2 -0
- package/deps/couchbase-cxx-client/core/operations/management/query_index_drop.cxx +11 -16
- package/deps/couchbase-cxx-client/core/operations/management/query_index_drop.hxx +2 -0
- package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all.cxx +8 -12
- package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all.hxx +4 -3
- package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all_deferred.cxx +21 -12
- package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all_deferred.hxx +3 -2
- package/deps/couchbase-cxx-client/core/origin.hxx +1 -1
- package/deps/couchbase-cxx-client/core/platform/uuid.cc +1 -2
- package/deps/couchbase-cxx-client/core/protocol/cmd_hello.hxx +5 -1
- package/deps/couchbase-cxx-client/core/query_context.hxx +79 -0
- package/deps/couchbase-cxx-client/core/tracing/CMakeLists.txt +3 -1
- package/deps/couchbase-cxx-client/core/tracing/threshold_logging_tracer.cxx +19 -4
- package/deps/couchbase-cxx-client/core/tracing/threshold_logging_tracer.hxx +2 -2
- package/deps/couchbase-cxx-client/core/transactions/async_attempt_context.hxx +10 -4
- package/deps/couchbase-cxx-client/core/transactions/atr_cleanup_entry.cxx +52 -63
- package/deps/couchbase-cxx-client/core/transactions/attempt_context.hxx +8 -3
- package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.cxx +163 -126
- package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.hxx +24 -37
- package/deps/couchbase-cxx-client/core/transactions/forward_compat.hxx +4 -4
- package/deps/couchbase-cxx-client/core/transactions/internal/atr_cleanup_entry.hxx +51 -13
- package/deps/couchbase-cxx-client/core/transactions/internal/client_record.hxx +26 -1
- package/deps/couchbase-cxx-client/core/transactions/internal/doc_record.hxx +21 -0
- package/deps/couchbase-cxx-client/core/transactions/internal/logging.hxx +40 -18
- package/deps/couchbase-cxx-client/core/transactions/internal/transaction_context.hxx +5 -0
- package/deps/couchbase-cxx-client/core/transactions/result.hxx +26 -0
- package/deps/couchbase-cxx-client/core/transactions/staged_mutation.cxx +48 -47
- package/deps/couchbase-cxx-client/core/transactions/staged_mutation.hxx +6 -6
- package/deps/couchbase-cxx-client/core/transactions/transaction_context.cxx +33 -19
- package/deps/couchbase-cxx-client/core/transactions/transaction_get_result.hxx +18 -2
- package/deps/couchbase-cxx-client/core/transactions/transaction_links.hxx +25 -2
- package/deps/couchbase-cxx-client/core/transactions/transactions.cxx +4 -4
- package/deps/couchbase-cxx-client/core/transactions/transactions_cleanup.cxx +49 -56
- package/deps/couchbase-cxx-client/core/transactions/waitable_op_list.hxx +7 -7
- package/deps/couchbase-cxx-client/core/transactions.hxx +0 -12
- package/deps/couchbase-cxx-client/core/utils/binary.hxx +1 -1
- package/deps/couchbase-cxx-client/core/utils/keyspace.hxx +55 -0
- package/deps/couchbase-cxx-client/couchbase/build_query_index_options.hxx +12 -45
- package/deps/couchbase-cxx-client/couchbase/cluster.hxx +1 -1
- package/deps/couchbase-cxx-client/couchbase/cluster_options.hxx +6 -7
- package/deps/couchbase-cxx-client/couchbase/collection.hxx +8 -0
- package/deps/couchbase-cxx-client/couchbase/collection_query_index_manager.hxx +218 -0
- package/deps/couchbase-cxx-client/couchbase/configuration_profiles_registry.hxx +3 -0
- package/deps/couchbase-cxx-client/couchbase/create_primary_query_index_options.hxx +166 -0
- package/deps/couchbase-cxx-client/couchbase/create_query_index_options.hxx +172 -0
- package/deps/couchbase-cxx-client/couchbase/drop_primary_query_index_options.hxx +129 -0
- package/deps/couchbase-cxx-client/couchbase/drop_query_index_options.hxx +116 -0
- package/deps/couchbase-cxx-client/couchbase/fmt/cas.hxx +1 -1
- package/deps/couchbase-cxx-client/couchbase/fmt/query_scan_consistency.hxx +46 -0
- package/deps/couchbase-cxx-client/couchbase/fmt/query_status.hxx +70 -0
- package/deps/couchbase-cxx-client/couchbase/fmt/tls_verify_mode.hxx +46 -0
- package/deps/couchbase-cxx-client/couchbase/get_all_query_indexes_options.hxx +100 -0
- package/deps/couchbase-cxx-client/{core → couchbase}/management/query_index.hxx +2 -2
- package/deps/couchbase-cxx-client/couchbase/metrics/meter.hxx +16 -0
- package/deps/couchbase-cxx-client/couchbase/query_index_manager.hxx +178 -6
- package/deps/couchbase-cxx-client/couchbase/query_options.hxx +1 -18
- package/deps/couchbase-cxx-client/couchbase/scope.hxx +5 -2
- package/deps/couchbase-cxx-client/couchbase/tracing/request_tracer.hxx +16 -0
- package/deps/couchbase-cxx-client/couchbase/transactions/async_attempt_context.hxx +11 -4
- package/deps/couchbase-cxx-client/couchbase/transactions/attempt_context.hxx +5 -3
- package/deps/couchbase-cxx-client/couchbase/transactions/transaction_keyspace.hxx +16 -0
- package/deps/couchbase-cxx-client/couchbase/transactions/transaction_query_options.hxx +0 -6
- package/deps/couchbase-cxx-client/couchbase/watch_query_indexes_options.hxx +115 -0
- package/deps/couchbase-cxx-client/examples/minimal.cxx +3 -1
- package/deps/couchbase-cxx-client/test/test_integration_crud.cxx +72 -0
- package/deps/couchbase-cxx-client/test/test_integration_management.cxx +727 -310
- package/deps/couchbase-cxx-client/test/test_integration_query.cxx +4 -8
- package/deps/couchbase-cxx-client/test/test_integration_transcoders.cxx +14 -0
- package/deps/couchbase-cxx-client/test/test_transaction_transaction_public_blocking_api.cxx +34 -19
- package/deps/couchbase-cxx-client/test/test_unit_transaction_logging.cxx +66 -22
- package/deps/couchbase-cxx-client/test/test_unit_utils.cxx +51 -0
- package/deps/couchbase-cxx-client/test/tools/tool_kv_loader.cxx +2 -2
- package/deps/couchbase-cxx-client/test/utils/integration_test_guard.cxx +2 -0
- package/deps/couchbase-cxx-client/test/utils/wait_until.cxx +4 -4
- package/deps/couchbase-cxx-client/third_party/docopt/.travis.yml +103 -0
- package/deps/couchbase-cxx-client/third_party/docopt/CMakeLists.txt +129 -0
- package/deps/couchbase-cxx-client/third_party/docopt/LICENSE-Boost-1.0 +23 -0
- package/deps/couchbase-cxx-client/third_party/docopt/LICENSE-MIT +23 -0
- package/deps/couchbase-cxx-client/third_party/docopt/README.rst +479 -0
- package/deps/couchbase-cxx-client/third_party/docopt/docopt-config.cmake +1 -0
- package/deps/couchbase-cxx-client/third_party/docopt/docopt.cpp +687 -0
- package/deps/couchbase-cxx-client/third_party/docopt/docopt.h +98 -0
- package/deps/couchbase-cxx-client/third_party/docopt/docopt.pc.in +9 -0
- package/deps/couchbase-cxx-client/third_party/docopt/docopt_private.h +676 -0
- package/deps/couchbase-cxx-client/third_party/docopt/docopt_util.h +122 -0
- package/deps/couchbase-cxx-client/third_party/docopt/docopt_value.h +341 -0
- package/deps/couchbase-cxx-client/third_party/docopt/examples/naval_fate.cpp +36 -0
- package/deps/couchbase-cxx-client/third_party/docopt/main.cpp +16 -0
- package/deps/couchbase-cxx-client/third_party/docopt/run_testcase.cpp +40 -0
- package/deps/couchbase-cxx-client/third_party/docopt/run_tests.py +72 -0
- package/deps/couchbase-cxx-client/third_party/docopt/testcases.docopt +957 -0
- package/deps/couchbase-cxx-client/tools/CMakeLists.txt +14 -0
- package/deps/couchbase-cxx-client/tools/cbc.cxx +65 -0
- package/deps/couchbase-cxx-client/tools/command.hxx +31 -0
- package/deps/couchbase-cxx-client/tools/command_registry.cxx +43 -0
- package/deps/couchbase-cxx-client/tools/command_registry.hxx +39 -0
- package/deps/couchbase-cxx-client/tools/get.cxx +267 -0
- package/deps/couchbase-cxx-client/tools/get.hxx +26 -0
- package/deps/couchbase-cxx-client/tools/query.cxx +441 -0
- package/deps/couchbase-cxx-client/tools/query.hxx +26 -0
- package/deps/couchbase-cxx-client/tools/utils.cxx +418 -0
- package/deps/couchbase-cxx-client/tools/utils.hxx +150 -0
- package/deps/couchbase-cxx-client/tools/version.cxx +82 -0
- package/deps/couchbase-cxx-client/tools/version.hxx +26 -0
- package/dist/authenticators.d.ts +2 -2
- package/dist/authenticators.js +1 -2
- package/dist/binding.d.ts +32 -16
- package/dist/cluster.js +14 -7
- package/dist/collection.d.ts +6 -0
- package/dist/collection.js +8 -0
- package/dist/queryexecutor.js +1 -1
- package/dist/queryindexmanager.d.ts +100 -4
- package/dist/queryindexmanager.js +344 -118
- package/dist/transactions.js +0 -2
- package/package.json +1 -1
- package/src/connection.cpp +2 -0
- package/src/connection.hpp +1 -0
- package/src/connection_autogen.cpp +16 -0
- package/src/jstocbpp_autogen.hpp +93 -23
- package/src/jstocbpp_basic.hpp +24 -0
- package/src/jstocbpp_transactions.hpp +0 -8
- package/tools/gen-bindings-js.js +1 -0
- package/tools/gen-bindings-json.py +4 -2
- package/deps/couchbase-cxx-client/core/transactions/logging.cxx +0 -107
@@ -0,0 +1,122 @@
|
|
1
|
+
//
|
2
|
+
// docopt_util.h
|
3
|
+
// docopt
|
4
|
+
//
|
5
|
+
// Created by Jared Grubb on 2013-11-04.
|
6
|
+
// Copyright (c) 2013 Jared Grubb. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
#ifndef docopt_docopt_util_h
|
10
|
+
#define docopt_docopt_util_h
|
11
|
+
|
12
|
+
#if DOCTOPT_USE_BOOST_REGEX
|
13
|
+
#include <boost/regex.hpp>
|
14
|
+
namespace std {
|
15
|
+
using boost::regex;
|
16
|
+
using boost::sregex_token_iterator;
|
17
|
+
}
|
18
|
+
#else
|
19
|
+
#include <regex>
|
20
|
+
#endif
|
21
|
+
|
22
|
+
#if 0
|
23
|
+
#pragma mark -
|
24
|
+
#pragma mark General utility
|
25
|
+
#endif
|
26
|
+
|
27
|
+
namespace {
|
28
|
+
bool starts_with(std::string const& str, std::string const& prefix)
|
29
|
+
{
|
30
|
+
if (str.length() < prefix.length())
|
31
|
+
return false;
|
32
|
+
return std::equal(prefix.begin(), prefix.end(),
|
33
|
+
str.begin());
|
34
|
+
}
|
35
|
+
|
36
|
+
std::string trim(std::string&& str,
|
37
|
+
const std::string& whitespace = " \t\n")
|
38
|
+
{
|
39
|
+
const auto strEnd = str.find_last_not_of(whitespace);
|
40
|
+
if (strEnd==std::string::npos)
|
41
|
+
return {}; // no content
|
42
|
+
str.erase(strEnd+1);
|
43
|
+
|
44
|
+
const auto strBegin = str.find_first_not_of(whitespace);
|
45
|
+
str.erase(0, strBegin);
|
46
|
+
|
47
|
+
return std::move(str);
|
48
|
+
}
|
49
|
+
|
50
|
+
std::vector<std::string> split(std::string const& str, size_t pos = 0)
|
51
|
+
{
|
52
|
+
const char* const anySpace = " \t\r\n\v\f";
|
53
|
+
|
54
|
+
std::vector<std::string> ret;
|
55
|
+
while (pos != std::string::npos) {
|
56
|
+
auto start = str.find_first_not_of(anySpace, pos);
|
57
|
+
if (start == std::string::npos) break;
|
58
|
+
|
59
|
+
auto end = str.find_first_of(anySpace, start);
|
60
|
+
auto size = end==std::string::npos ? end : end-start;
|
61
|
+
ret.emplace_back(str.substr(start, size));
|
62
|
+
|
63
|
+
pos = end;
|
64
|
+
}
|
65
|
+
|
66
|
+
return ret;
|
67
|
+
}
|
68
|
+
|
69
|
+
std::tuple<std::string, std::string, std::string> partition(std::string str, std::string const& point)
|
70
|
+
{
|
71
|
+
std::tuple<std::string, std::string, std::string> ret;
|
72
|
+
|
73
|
+
auto i = str.find(point);
|
74
|
+
|
75
|
+
if (i == std::string::npos) {
|
76
|
+
// no match: string goes in 0th spot only
|
77
|
+
} else {
|
78
|
+
std::get<2>(ret) = str.substr(i + point.size());
|
79
|
+
std::get<1>(ret) = point;
|
80
|
+
str.resize(i);
|
81
|
+
}
|
82
|
+
std::get<0>(ret) = std::move(str);
|
83
|
+
|
84
|
+
return ret;
|
85
|
+
}
|
86
|
+
|
87
|
+
template <typename I>
|
88
|
+
std::string join(I iter, I end, std::string const& delim) {
|
89
|
+
if (iter==end)
|
90
|
+
return {};
|
91
|
+
|
92
|
+
std::string ret = *iter;
|
93
|
+
for(++iter; iter!=end; ++iter) {
|
94
|
+
ret.append(delim);
|
95
|
+
ret.append(*iter);
|
96
|
+
}
|
97
|
+
return ret;
|
98
|
+
}
|
99
|
+
|
100
|
+
std::vector<std::string> regex_split(std::string const& text, std::regex const& re)
|
101
|
+
{
|
102
|
+
std::vector<std::string> ret;
|
103
|
+
for (auto it = std::sregex_token_iterator(text.begin(), text.end(), re, -1);
|
104
|
+
it != std::sregex_token_iterator();
|
105
|
+
++it) {
|
106
|
+
ret.emplace_back(*it);
|
107
|
+
}
|
108
|
+
return ret;
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
namespace docopt {
|
113
|
+
template <class T>
|
114
|
+
inline void hash_combine(std::size_t& seed, T const& v)
|
115
|
+
{
|
116
|
+
// stolen from boost::hash_combine
|
117
|
+
std::hash<T> hasher;
|
118
|
+
seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
|
119
|
+
}
|
120
|
+
}
|
121
|
+
|
122
|
+
#endif
|
@@ -0,0 +1,341 @@
|
|
1
|
+
//
|
2
|
+
// value.h
|
3
|
+
// docopt
|
4
|
+
//
|
5
|
+
// Created by Jared Grubb on 2013-10-14.
|
6
|
+
// Copyright (c) 2013 Jared Grubb. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
#ifndef docopt__value_h_
|
10
|
+
#define docopt__value_h_
|
11
|
+
|
12
|
+
#include <string>
|
13
|
+
#include <vector>
|
14
|
+
#include <functional> // std::hash
|
15
|
+
#include <iosfwd>
|
16
|
+
#include <stdexcept>
|
17
|
+
|
18
|
+
namespace docopt {
|
19
|
+
|
20
|
+
enum class Kind {
|
21
|
+
Empty,
|
22
|
+
Bool,
|
23
|
+
Long,
|
24
|
+
String,
|
25
|
+
StringList
|
26
|
+
};
|
27
|
+
|
28
|
+
/// A generic type to hold the various types that can be produced by docopt.
|
29
|
+
///
|
30
|
+
/// This type can be one of: {bool, long, string, vector<string>}, or empty.
|
31
|
+
struct value {
|
32
|
+
/// An empty value
|
33
|
+
value() {}
|
34
|
+
|
35
|
+
value(std::string);
|
36
|
+
value(std::vector<std::string>);
|
37
|
+
|
38
|
+
explicit value(bool);
|
39
|
+
explicit value(long);
|
40
|
+
explicit value(int v) : value(static_cast<long>(v)) {}
|
41
|
+
|
42
|
+
~value();
|
43
|
+
value(value const&);
|
44
|
+
value(value&&) noexcept;
|
45
|
+
value& operator=(value const&);
|
46
|
+
value& operator=(value&&) noexcept;
|
47
|
+
|
48
|
+
Kind kind() const { return kind_; }
|
49
|
+
|
50
|
+
// Test if this object has any contents at all
|
51
|
+
explicit operator bool() const { return kind_ != Kind::Empty; }
|
52
|
+
|
53
|
+
// Test the type contained by this value object
|
54
|
+
bool isBool() const { return kind_==Kind::Bool; }
|
55
|
+
bool isString() const { return kind_==Kind::String; }
|
56
|
+
bool isLong() const { return kind_==Kind::Long; }
|
57
|
+
bool isStringList() const { return kind_==Kind::StringList; }
|
58
|
+
|
59
|
+
// Throws std::invalid_argument if the type does not match
|
60
|
+
bool asBool() const;
|
61
|
+
long asLong() const;
|
62
|
+
std::string const& asString() const;
|
63
|
+
std::vector<std::string> const& asStringList() const;
|
64
|
+
|
65
|
+
size_t hash() const noexcept;
|
66
|
+
|
67
|
+
friend bool operator==(value const&, value const&);
|
68
|
+
friend bool operator!=(value const&, value const&);
|
69
|
+
|
70
|
+
private:
|
71
|
+
union Variant {
|
72
|
+
Variant() {}
|
73
|
+
~Variant() { /* do nothing; will be destroyed by ~value */ }
|
74
|
+
|
75
|
+
bool boolValue;
|
76
|
+
long longValue;
|
77
|
+
std::string strValue;
|
78
|
+
std::vector<std::string> strList;
|
79
|
+
};
|
80
|
+
|
81
|
+
static const char* kindAsString(Kind kind) {
|
82
|
+
switch (kind) {
|
83
|
+
case Kind::Empty: return "empty";
|
84
|
+
case Kind::Bool: return "bool";
|
85
|
+
case Kind::Long: return "long";
|
86
|
+
case Kind::String: return "string";
|
87
|
+
case Kind::StringList: return "string-list";
|
88
|
+
}
|
89
|
+
return "unknown";
|
90
|
+
}
|
91
|
+
|
92
|
+
void throwIfNotKind(Kind expected) const {
|
93
|
+
if (kind_ == expected)
|
94
|
+
return;
|
95
|
+
|
96
|
+
std::string error = "Illegal cast to ";
|
97
|
+
error += kindAsString(expected);
|
98
|
+
error += "; type is actually ";
|
99
|
+
error += kindAsString(kind_);
|
100
|
+
throw std::runtime_error(std::move(error));
|
101
|
+
}
|
102
|
+
|
103
|
+
Kind kind_ = Kind::Empty;
|
104
|
+
Variant variant_ {};
|
105
|
+
};
|
106
|
+
|
107
|
+
/// Write out the contents to the ostream
|
108
|
+
DOCOPT_API std::ostream& operator<<(std::ostream&, value const&);
|
109
|
+
}
|
110
|
+
|
111
|
+
namespace std {
|
112
|
+
template <>
|
113
|
+
struct hash<docopt::value> {
|
114
|
+
size_t operator()(docopt::value const& val) const noexcept {
|
115
|
+
return val.hash();
|
116
|
+
}
|
117
|
+
};
|
118
|
+
}
|
119
|
+
|
120
|
+
namespace docopt {
|
121
|
+
inline
|
122
|
+
value::value(bool v)
|
123
|
+
: kind_(Kind::Bool)
|
124
|
+
{
|
125
|
+
variant_.boolValue = v;
|
126
|
+
}
|
127
|
+
|
128
|
+
inline
|
129
|
+
value::value(long v)
|
130
|
+
: kind_(Kind::Long)
|
131
|
+
{
|
132
|
+
variant_.longValue = v;
|
133
|
+
}
|
134
|
+
|
135
|
+
inline
|
136
|
+
value::value(std::string v)
|
137
|
+
: kind_(Kind::String)
|
138
|
+
{
|
139
|
+
new (&variant_.strValue) std::string(std::move(v));
|
140
|
+
}
|
141
|
+
|
142
|
+
inline
|
143
|
+
value::value(std::vector<std::string> v)
|
144
|
+
: kind_(Kind::StringList)
|
145
|
+
{
|
146
|
+
new (&variant_.strList) std::vector<std::string>(std::move(v));
|
147
|
+
}
|
148
|
+
|
149
|
+
inline
|
150
|
+
value::value(value const& other)
|
151
|
+
: kind_(other.kind_)
|
152
|
+
{
|
153
|
+
switch (kind_) {
|
154
|
+
case Kind::String:
|
155
|
+
new (&variant_.strValue) std::string(other.variant_.strValue);
|
156
|
+
break;
|
157
|
+
|
158
|
+
case Kind::StringList:
|
159
|
+
new (&variant_.strList) std::vector<std::string>(other.variant_.strList);
|
160
|
+
break;
|
161
|
+
|
162
|
+
case Kind::Bool:
|
163
|
+
variant_.boolValue = other.variant_.boolValue;
|
164
|
+
break;
|
165
|
+
|
166
|
+
case Kind::Long:
|
167
|
+
variant_.longValue = other.variant_.longValue;
|
168
|
+
break;
|
169
|
+
|
170
|
+
case Kind::Empty:
|
171
|
+
default:
|
172
|
+
break;
|
173
|
+
}
|
174
|
+
}
|
175
|
+
|
176
|
+
inline
|
177
|
+
value::value(value&& other) noexcept
|
178
|
+
: kind_(other.kind_)
|
179
|
+
{
|
180
|
+
switch (kind_) {
|
181
|
+
case Kind::String:
|
182
|
+
new (&variant_.strValue) std::string(std::move(other.variant_.strValue));
|
183
|
+
break;
|
184
|
+
|
185
|
+
case Kind::StringList:
|
186
|
+
new (&variant_.strList) std::vector<std::string>(std::move(other.variant_.strList));
|
187
|
+
break;
|
188
|
+
|
189
|
+
case Kind::Bool:
|
190
|
+
variant_.boolValue = other.variant_.boolValue;
|
191
|
+
break;
|
192
|
+
|
193
|
+
case Kind::Long:
|
194
|
+
variant_.longValue = other.variant_.longValue;
|
195
|
+
break;
|
196
|
+
|
197
|
+
case Kind::Empty:
|
198
|
+
default:
|
199
|
+
break;
|
200
|
+
}
|
201
|
+
}
|
202
|
+
|
203
|
+
inline
|
204
|
+
value::~value()
|
205
|
+
{
|
206
|
+
switch (kind_) {
|
207
|
+
case Kind::String:
|
208
|
+
variant_.strValue.~basic_string();
|
209
|
+
break;
|
210
|
+
|
211
|
+
case Kind::StringList:
|
212
|
+
variant_.strList.~vector();
|
213
|
+
break;
|
214
|
+
|
215
|
+
case Kind::Empty:
|
216
|
+
case Kind::Bool:
|
217
|
+
case Kind::Long:
|
218
|
+
default:
|
219
|
+
// trivial dtor
|
220
|
+
break;
|
221
|
+
}
|
222
|
+
}
|
223
|
+
|
224
|
+
inline
|
225
|
+
value& value::operator=(value const& other) {
|
226
|
+
// make a copy and move from it; way easier.
|
227
|
+
return *this = value{other};
|
228
|
+
}
|
229
|
+
|
230
|
+
inline
|
231
|
+
value& value::operator=(value&& other) noexcept {
|
232
|
+
// move of all the types involved is noexcept, so we dont have to worry about
|
233
|
+
// these two statements throwing, which gives us a consistency guarantee.
|
234
|
+
this->~value();
|
235
|
+
new (this) value(std::move(other));
|
236
|
+
|
237
|
+
return *this;
|
238
|
+
}
|
239
|
+
|
240
|
+
template <class T>
|
241
|
+
void hash_combine(std::size_t& seed, const T& v);
|
242
|
+
|
243
|
+
inline
|
244
|
+
size_t value::hash() const noexcept
|
245
|
+
{
|
246
|
+
switch (kind_) {
|
247
|
+
case Kind::String:
|
248
|
+
return std::hash<std::string>()(variant_.strValue);
|
249
|
+
|
250
|
+
case Kind::StringList: {
|
251
|
+
size_t seed = std::hash<size_t>()(variant_.strList.size());
|
252
|
+
for(auto const& str : variant_.strList) {
|
253
|
+
hash_combine(seed, str);
|
254
|
+
}
|
255
|
+
return seed;
|
256
|
+
}
|
257
|
+
|
258
|
+
case Kind::Bool:
|
259
|
+
return std::hash<bool>()(variant_.boolValue);
|
260
|
+
|
261
|
+
case Kind::Long:
|
262
|
+
return std::hash<long>()(variant_.longValue);
|
263
|
+
|
264
|
+
case Kind::Empty:
|
265
|
+
default:
|
266
|
+
return std::hash<void*>()(nullptr);
|
267
|
+
}
|
268
|
+
}
|
269
|
+
|
270
|
+
inline
|
271
|
+
bool value::asBool() const
|
272
|
+
{
|
273
|
+
throwIfNotKind(Kind::Bool);
|
274
|
+
return variant_.boolValue;
|
275
|
+
}
|
276
|
+
|
277
|
+
inline
|
278
|
+
long value::asLong() const
|
279
|
+
{
|
280
|
+
// Attempt to convert a string to a long
|
281
|
+
if (kind_ == Kind::String) {
|
282
|
+
const std::string& str = variant_.strValue;
|
283
|
+
std::size_t pos;
|
284
|
+
const long ret = stol(str, &pos); // Throws if it can't convert
|
285
|
+
if (pos != str.length()) {
|
286
|
+
// The string ended in non-digits.
|
287
|
+
throw std::runtime_error( str + " contains non-numeric characters.");
|
288
|
+
}
|
289
|
+
return ret;
|
290
|
+
}
|
291
|
+
throwIfNotKind(Kind::Long);
|
292
|
+
return variant_.longValue;
|
293
|
+
}
|
294
|
+
|
295
|
+
inline
|
296
|
+
std::string const& value::asString() const
|
297
|
+
{
|
298
|
+
throwIfNotKind(Kind::String);
|
299
|
+
return variant_.strValue;
|
300
|
+
}
|
301
|
+
|
302
|
+
inline
|
303
|
+
std::vector<std::string> const& value::asStringList() const
|
304
|
+
{
|
305
|
+
throwIfNotKind(Kind::StringList);
|
306
|
+
return variant_.strList;
|
307
|
+
}
|
308
|
+
|
309
|
+
inline
|
310
|
+
bool operator==(value const& v1, value const& v2)
|
311
|
+
{
|
312
|
+
if (v1.kind_ != v2.kind_)
|
313
|
+
return false;
|
314
|
+
|
315
|
+
switch (v1.kind_) {
|
316
|
+
case Kind::String:
|
317
|
+
return v1.variant_.strValue==v2.variant_.strValue;
|
318
|
+
|
319
|
+
case Kind::StringList:
|
320
|
+
return v1.variant_.strList==v2.variant_.strList;
|
321
|
+
|
322
|
+
case Kind::Bool:
|
323
|
+
return v1.variant_.boolValue==v2.variant_.boolValue;
|
324
|
+
|
325
|
+
case Kind::Long:
|
326
|
+
return v1.variant_.longValue==v2.variant_.longValue;
|
327
|
+
|
328
|
+
case Kind::Empty:
|
329
|
+
default:
|
330
|
+
return true;
|
331
|
+
}
|
332
|
+
}
|
333
|
+
|
334
|
+
inline
|
335
|
+
bool operator!=(value const& v1, value const& v2)
|
336
|
+
{
|
337
|
+
return !(v1 == v2);
|
338
|
+
}
|
339
|
+
}
|
340
|
+
|
341
|
+
#endif /* defined(docopt__value_h_) */
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#include "docopt.h"
|
2
|
+
|
3
|
+
#include <iostream>
|
4
|
+
|
5
|
+
static const char USAGE[] =
|
6
|
+
R"(Naval Fate.
|
7
|
+
|
8
|
+
Usage:
|
9
|
+
naval_fate ship new <name>...
|
10
|
+
naval_fate ship <name> move <x> <y> [--speed=<kn>]
|
11
|
+
naval_fate ship shoot <x> <y>
|
12
|
+
naval_fate mine (set|remove) <x> <y> [--moored | --drifting]
|
13
|
+
naval_fate (-h | --help)
|
14
|
+
naval_fate --version
|
15
|
+
|
16
|
+
Options:
|
17
|
+
-h --help Show this screen.
|
18
|
+
--version Show version.
|
19
|
+
--speed=<kn> Speed in knots [default: 10].
|
20
|
+
--moored Moored (anchored) mine.
|
21
|
+
--drifting Drifting mine.
|
22
|
+
)";
|
23
|
+
|
24
|
+
int main(int argc, const char** argv)
|
25
|
+
{
|
26
|
+
std::map<std::string, docopt::value> args = docopt::docopt(USAGE,
|
27
|
+
{ argv + 1, argv + argc },
|
28
|
+
true, // show help if requested
|
29
|
+
"Naval Fate 2.0"); // version string
|
30
|
+
|
31
|
+
for(auto const& arg : args) {
|
32
|
+
std::cout << arg.first << ": " << arg.second << std::endl;
|
33
|
+
}
|
34
|
+
|
35
|
+
return 0;
|
36
|
+
}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
//
|
2
|
+
// docopt_tests.cpp
|
3
|
+
// docopt
|
4
|
+
//
|
5
|
+
// Created by Jared Grubb on 2013-11-03.
|
6
|
+
// Copyright (c) 2013 Jared Grubb. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
#include "docopt.h"
|
10
|
+
|
11
|
+
#include <iostream>
|
12
|
+
|
13
|
+
int main(int argc, const char** argv)
|
14
|
+
{
|
15
|
+
if (argc < 2) {
|
16
|
+
std::cerr << "Usage: docopt_tests USAGE [arg]..." << std::endl;
|
17
|
+
exit(-5);
|
18
|
+
}
|
19
|
+
|
20
|
+
std::string usage = argv[1];
|
21
|
+
std::vector<std::string> args {argv+2, argv+argc};
|
22
|
+
|
23
|
+
auto result = docopt::docopt(usage, args);
|
24
|
+
|
25
|
+
// print it out in JSON form
|
26
|
+
std::cout << "{ ";
|
27
|
+
bool first = true;
|
28
|
+
for(auto const& arg : result) {
|
29
|
+
if (first) {
|
30
|
+
first = false;
|
31
|
+
} else {
|
32
|
+
std::cout << "," << std::endl;
|
33
|
+
}
|
34
|
+
|
35
|
+
std::cout << '"' << arg.first << '"' << ": " << arg.second;
|
36
|
+
}
|
37
|
+
std::cout << " }" << std::endl;
|
38
|
+
|
39
|
+
return 0;
|
40
|
+
}
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
|
3
|
+
import re
|
4
|
+
import sys
|
5
|
+
import json
|
6
|
+
import subprocess
|
7
|
+
|
8
|
+
executable = "${TESTPROG}"
|
9
|
+
|
10
|
+
def parse_test(raw):
|
11
|
+
raw = re.compile('#.*$', re.M).sub('', raw).strip()
|
12
|
+
if raw.startswith('"""'):
|
13
|
+
raw = raw[3:]
|
14
|
+
|
15
|
+
for fixture in raw.split('r"""'):
|
16
|
+
name = ''
|
17
|
+
doc, _, body = fixture.partition('"""')
|
18
|
+
cases = []
|
19
|
+
for case in body.split('$')[1:]:
|
20
|
+
argv, _, expect = case.strip().partition('\n')
|
21
|
+
expect = json.loads(expect)
|
22
|
+
prog, _, argv = argv.strip().partition(' ')
|
23
|
+
cases.append((prog, argv, expect))
|
24
|
+
|
25
|
+
yield name, doc, cases
|
26
|
+
|
27
|
+
failures = 0
|
28
|
+
passes = 0
|
29
|
+
|
30
|
+
tests = open('${TESTCASES}','r').read()
|
31
|
+
for _, doc, cases in parse_test(tests):
|
32
|
+
if not cases: continue
|
33
|
+
|
34
|
+
for prog, argv, expect in cases:
|
35
|
+
args = [ x for x in argv.split() if x ]
|
36
|
+
|
37
|
+
expect_error = not isinstance(expect, dict)
|
38
|
+
|
39
|
+
error = None
|
40
|
+
out = None
|
41
|
+
try:
|
42
|
+
out = subprocess.check_output([executable, doc]+args, stderr=subprocess.STDOUT)
|
43
|
+
if expect_error:
|
44
|
+
error = " ** an error was expected but it appeared to succeed!"
|
45
|
+
else:
|
46
|
+
json_out = json.loads(out)
|
47
|
+
if expect != json_out:
|
48
|
+
error = " ** JSON does not match expected: %r" % expect
|
49
|
+
except subprocess.CalledProcessError as e:
|
50
|
+
if not expect_error:
|
51
|
+
error = "\n ** this should have succeeded! exit code = %s" % e.returncode
|
52
|
+
|
53
|
+
if not error:
|
54
|
+
passes += 1
|
55
|
+
continue
|
56
|
+
|
57
|
+
failures += 1
|
58
|
+
|
59
|
+
print("="*40)
|
60
|
+
print(doc)
|
61
|
+
print(':'*20)
|
62
|
+
print(prog, argv)
|
63
|
+
print('-'*20)
|
64
|
+
if out:
|
65
|
+
print(out)
|
66
|
+
print(error)
|
67
|
+
|
68
|
+
if failures:
|
69
|
+
print("%d failures" % failures)
|
70
|
+
sys.exit(1)
|
71
|
+
else:
|
72
|
+
print("PASS (%d)" % passes)
|