aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/scheme/scheme.h
diff options
context:
space:
mode:
authorRuslan Kovalev <ruslan.a.kovalev@gmail.com>2022-02-10 16:46:44 +0300
committerDaniil Cherednik <dcherednik@yandex-team.ru>2022-02-10 16:46:44 +0300
commit59e19371de37995fcb36beb16cd6ec030af960bc (patch)
treefa68e36093ebff8b805462e9e6d331fe9d348214 /library/cpp/scheme/scheme.h
parent89db6fe2fe2c32d2a832ddfeb04e8d078e301084 (diff)
downloadydb-59e19371de37995fcb36beb16cd6ec030af960bc.tar.gz
Restoring authorship annotation for Ruslan Kovalev <ruslan.a.kovalev@gmail.com>. Commit 1 of 2.
Diffstat (limited to 'library/cpp/scheme/scheme.h')
-rw-r--r--library/cpp/scheme/scheme.h858
1 files changed, 429 insertions, 429 deletions
diff --git a/library/cpp/scheme/scheme.h b/library/cpp/scheme/scheme.h
index 3d7c59f3c9..1ebef0c316 100644
--- a/library/cpp/scheme/scheme.h
+++ b/library/cpp/scheme/scheme.h
@@ -1,20 +1,20 @@
-#pragma once
-
-#include "scimpl_defs.h"
-
+#pragma once
+
+#include "scimpl_defs.h"
+
#include "fwd.h"
-#include <iterator>
-#include <utility>
-
-namespace NSc {
+#include <iterator>
+#include <utility>
+
+namespace NSc {
#ifdef _MSC_VER
#pragma warning(disable : 4521 4522)
#endif
- // todo: try to remove some rarely used methods
- class TValue {
- public:
+ // todo: try to remove some rarely used methods
+ class TValue {
+ public:
enum class EType {
Null = 0 /* "Null" */,
Bool /* "Bool" */,
@@ -23,514 +23,514 @@ namespace NSc {
String /* "String" */,
Array /* "Array" */,
Dict /* "Dict" */
- };
-
- struct TScCore;
- using TCorePtr = TIntrusivePtr<TScCore>;
- using TPoolPtr = TIntrusivePtr<NDefinitions::TPool>;
-
- using TArray = ::NSc::TArray;
- using TDict = ::NSc::TDict;
-
+ };
+
+ struct TScCore;
+ using TCorePtr = TIntrusivePtr<TScCore>;
+ using TPoolPtr = TIntrusivePtr<NDefinitions::TPool>;
+
+ using TArray = ::NSc::TArray;
+ using TDict = ::NSc::TDict;
+
private: // A TValue instance has only these 3 fields
mutable TCorePtr TheCore; // a pointer to a refcounted (kind of) variant
- bool CopyOnWrite = false; // a flag that thevalue is a COW shallow copy and should produce a deep copy once modified
-
- // Thus all copies of a TValue are by default shallow. Use TValue::Clone to force a deep copy.
- // A COW copy will see changes in its parent, but no change in the COW copy will propagate to its parent.
-
- public:
+ bool CopyOnWrite = false; // a flag that thevalue is a COW shallow copy and should produce a deep copy once modified
+
+ // Thus all copies of a TValue are by default shallow. Use TValue::Clone to force a deep copy.
+ // A COW copy will see changes in its parent, but no change in the COW copy will propagate to its parent.
+
+ public:
inline TValue();
- inline TValue(TValue& v);
- inline TValue(const TValue& v);
- inline TValue(TValue&& v) noexcept;
-
- public: // Operators
- inline TValue(double t);
- inline TValue(unsigned long long t);
- inline TValue(unsigned long t);
- inline TValue(unsigned t);
- inline TValue(long long t);
- inline TValue(long t);
- inline TValue(int t);
+ inline TValue(TValue& v);
+ inline TValue(const TValue& v);
+ inline TValue(TValue&& v) noexcept;
+
+ public: // Operators
+ inline TValue(double t);
+ inline TValue(unsigned long long t);
+ inline TValue(unsigned long t);
+ inline TValue(unsigned t);
+ inline TValue(long long t);
+ inline TValue(long t);
+ inline TValue(int t);
// inline TValue(bool b);
-
- inline TValue(TStringBuf t);
- inline TValue(const char*);
-
- inline operator double() const;
- inline operator float() const;
- inline operator long long() const;
- inline operator long() const;
- inline operator int() const;
- inline operator short() const;
- inline operator char() const;
- inline operator unsigned long long() const;
- inline operator unsigned long() const;
- inline operator unsigned() const;
- inline operator unsigned short() const;
- inline operator unsigned char() const;
- inline operator signed char() const;
-
- inline operator TStringBuf() const;
-
- inline operator const ::NSc::TArray&() const;
- inline operator const ::NSc::TDict&() const;
-
- inline TValue& operator=(double t);
-
- inline TValue& operator=(unsigned long long t);
- inline TValue& operator=(unsigned long t);
- inline TValue& operator=(unsigned t);
-
- inline TValue& operator=(long long t);
- inline TValue& operator=(long t);
- inline TValue& operator=(int t);
+
+ inline TValue(TStringBuf t);
+ inline TValue(const char*);
+
+ inline operator double() const;
+ inline operator float() const;
+ inline operator long long() const;
+ inline operator long() const;
+ inline operator int() const;
+ inline operator short() const;
+ inline operator char() const;
+ inline operator unsigned long long() const;
+ inline operator unsigned long() const;
+ inline operator unsigned() const;
+ inline operator unsigned short() const;
+ inline operator unsigned char() const;
+ inline operator signed char() const;
+
+ inline operator TStringBuf() const;
+
+ inline operator const ::NSc::TArray&() const;
+ inline operator const ::NSc::TDict&() const;
+
+ inline TValue& operator=(double t);
+
+ inline TValue& operator=(unsigned long long t);
+ inline TValue& operator=(unsigned long t);
+ inline TValue& operator=(unsigned t);
+
+ inline TValue& operator=(long long t);
+ inline TValue& operator=(long t);
+ inline TValue& operator=(int t);
// inline TValue& operator=(bool t);
-
- inline TValue& operator=(TStringBuf t);
- inline TValue& operator=(const char* t);
-
+
+ inline TValue& operator=(TStringBuf t);
+ inline TValue& operator=(const char* t);
+
inline TValue& operator=(TValue& v) &;
inline TValue& operator=(const TValue& v) &;
inline TValue& operator=(TValue&& v) & noexcept;
-
+
inline TValue& operator=(TValue& v) && = delete;
inline TValue& operator=(const TValue& v) && = delete;
inline TValue& operator=(TValue&& v) && = delete;
- public:
- template <class T> // ui16 or TStringBuf
+ public:
+ template <class T> // ui16 or TStringBuf
inline TValue& operator[](const T& idx) {
return GetOrAdd(idx);
}
-
- template <class T> // ui16 or TStringBuf
+
+ template <class T> // ui16 or TStringBuf
inline const TValue& operator[](const T& idx) const {
return Get(idx);
}
-
- public: // Data methods ///////////////////////////////////////////////////////////
- inline EType GetType() const;
-
- inline bool IsNull() const;
-
- inline TValue& SetNull(); // returns self, will set type to Null
-
+
+ public: // Data methods ///////////////////////////////////////////////////////////
+ inline EType GetType() const;
+
+ inline bool IsNull() const;
+
+ inline TValue& SetNull(); // returns self, will set type to Null
+
TValue& Clear() {
return ClearArray().ClearDict().SetNull();
}
-
- public: // Number methods /////////////////////////////////////////////////////////
- // Bool, IntNumber and FloatNumber are all compatible.
- // If a TValue node has one of the types it may as well be used as another.
- // FloatNumber methods. Forces FloatNumber representation. Compatible with IntNumber and Bool
-
- inline bool IsNumber() const; // true if any of FloatNumber, IntNumber, Bool
-
- inline double GetNumber(double defaultval = 0) const; // Compatible with Bool, IntNumber and FloatNumber types
-
- inline double& GetNumberMutable(double defaultval = 0); // Will switch the type to FloatNumber
-
- inline TValue& SetNumber(double val = 0); // returns self, will switch the type to FloatNumber
-
- double ForceNumber(double deflt = 0) const; // Best-effort cast to double (will do TryFromString if applicable)
-
- // IntNumber methods. Forces integer representation. Compatible with FloatNumber and Bool types.
- // Note: if you don't care about distinguishing bools, ints and doubles, use *Number methods above
-
- inline bool IsIntNumber() const; // true only if IntNumber or Bool
-
- inline i64 GetIntNumber(i64 defaultval = 0) const; // Compatible with Bool, IntNumber and FloatNumber types
-
- inline i64& GetIntNumberMutable(i64 defaultval = 0); // Will switch the type to IntNumber
-
- inline TValue& SetIntNumber(i64 val = 0); // returns self, will switch the type to IntNumber
-
- i64 ForceIntNumber(i64 deflt = 0) const; // Best-effort cast to i64 (will do TryFromString for String)
-
- // Bool methods. Forces bool representation. Compatible with Float Number and Int Number methods above.
- // Note: if you don't care about distinguishing Bool, IntNumber and FloatNumber, use *Number methods above
-
- inline bool IsBool() const; // true only if Bool
-
- inline bool GetBool(bool defaultval = false) const; // Compatible with Bool, IntNumber and FloatNumber types
-
- inline TValue& SetBool(bool val = false); // returns self, will switch the type to Bool
-
- public: // Arcadia-specific boolean representation support
- // Tests for explicit True, also checks for arcadia-specific boolean representation
- bool IsTrue() const {
- return IsNumber() ? GetNumber() : ::IsTrue(GetString());
- }
-
- // Tests for explicit False, also checks for arcadia-specific boolean representation
- bool IsExplicitFalse() const {
- return IsNumber() ? !GetNumber() : IsFalse(GetString());
- }
-
- public: // String methods /////////////////////////////////////////////////////////
- inline bool IsString() const;
-
- inline TStringBuf GetString(TStringBuf defaultval = TStringBuf()) const;
-
- inline TValue& SetString(TStringBuf val = TStringBuf()); // returns self
-
+
+ public: // Number methods /////////////////////////////////////////////////////////
+ // Bool, IntNumber and FloatNumber are all compatible.
+ // If a TValue node has one of the types it may as well be used as another.
+ // FloatNumber methods. Forces FloatNumber representation. Compatible with IntNumber and Bool
+
+ inline bool IsNumber() const; // true if any of FloatNumber, IntNumber, Bool
+
+ inline double GetNumber(double defaultval = 0) const; // Compatible with Bool, IntNumber and FloatNumber types
+
+ inline double& GetNumberMutable(double defaultval = 0); // Will switch the type to FloatNumber
+
+ inline TValue& SetNumber(double val = 0); // returns self, will switch the type to FloatNumber
+
+ double ForceNumber(double deflt = 0) const; // Best-effort cast to double (will do TryFromString if applicable)
+
+ // IntNumber methods. Forces integer representation. Compatible with FloatNumber and Bool types.
+ // Note: if you don't care about distinguishing bools, ints and doubles, use *Number methods above
+
+ inline bool IsIntNumber() const; // true only if IntNumber or Bool
+
+ inline i64 GetIntNumber(i64 defaultval = 0) const; // Compatible with Bool, IntNumber and FloatNumber types
+
+ inline i64& GetIntNumberMutable(i64 defaultval = 0); // Will switch the type to IntNumber
+
+ inline TValue& SetIntNumber(i64 val = 0); // returns self, will switch the type to IntNumber
+
+ i64 ForceIntNumber(i64 deflt = 0) const; // Best-effort cast to i64 (will do TryFromString for String)
+
+ // Bool methods. Forces bool representation. Compatible with Float Number and Int Number methods above.
+ // Note: if you don't care about distinguishing Bool, IntNumber and FloatNumber, use *Number methods above
+
+ inline bool IsBool() const; // true only if Bool
+
+ inline bool GetBool(bool defaultval = false) const; // Compatible with Bool, IntNumber and FloatNumber types
+
+ inline TValue& SetBool(bool val = false); // returns self, will switch the type to Bool
+
+ public: // Arcadia-specific boolean representation support
+ // Tests for explicit True, also checks for arcadia-specific boolean representation
+ bool IsTrue() const {
+ return IsNumber() ? GetNumber() : ::IsTrue(GetString());
+ }
+
+ // Tests for explicit False, also checks for arcadia-specific boolean representation
+ bool IsExplicitFalse() const {
+ return IsNumber() ? !GetNumber() : IsFalse(GetString());
+ }
+
+ public: // String methods /////////////////////////////////////////////////////////
+ inline bool IsString() const;
+
+ inline TStringBuf GetString(TStringBuf defaultval = TStringBuf()) const;
+
+ inline TValue& SetString(TStringBuf val = TStringBuf()); // returns self
+
TString ForceString(const TString& deflt = TString()) const; // Best-effort cast to TString (will do ToString for numeric types)
-
- // todo: remove
+
+ // todo: remove
inline bool StringEmpty() const;
- inline size_t StringSize() const;
-
- public: // Array methods //////////////////////////////////////////////////////////
- inline bool IsArray() const;
-
- inline const TArray& GetArray() const;
- inline TArray& GetArrayMutable();
- inline TValue& SetArray(); // turns into array if needed, returns self
- inline TValue& ClearArray();
-
- inline bool Has(size_t idx) const;
-
- inline const TValue& Get(size_t idx) const; // returns child or default
+ inline size_t StringSize() const;
+
+ public: // Array methods //////////////////////////////////////////////////////////
+ inline bool IsArray() const;
+
+ inline const TArray& GetArray() const;
+ inline TArray& GetArrayMutable();
+ inline TValue& SetArray(); // turns into array if needed, returns self
+ inline TValue& ClearArray();
+
+ inline bool Has(size_t idx) const;
+
+ inline const TValue& Get(size_t idx) const; // returns child or default
inline TValue* GetNoAdd(size_t idx); // returns link to existing child or nullptr
-
- inline TValue& Push(); // returns new child
-
- template <class T>
- TValue& Push(T&& t) {
- return Push() = std::forward<T>(t);
- } // returns new child
-
+
+ inline TValue& Push(); // returns new child
+
+ template <class T>
+ TValue& Push(T&& t) {
+ return Push() = std::forward<T>(t);
+ } // returns new child
+
TValue& Insert(ui16 idx) {
return InsertUnsafe(idx);
} // creates missing values, returns new child
-
- template <class T>
- TValue& Insert(ui16 idx, T&& v) {
- return InsertUnsafe(idx, std::forward<T>(v));
+
+ template <class T>
+ TValue& Insert(ui16 idx, T&& v) {
+ return InsertUnsafe(idx, std::forward<T>(v));
} // creates missing values, returns new child
-
- template <class TIt>
- inline TValue& AppendAll(TIt begin, TIt end); // Append(vec.begin(), vec.end())
-
- template <class TColl>
+
+ template <class TIt>
+ inline TValue& AppendAll(TIt begin, TIt end); // Append(vec.begin(), vec.end())
+
+ template <class TColl>
inline TValue& AppendAll(TColl&& coll); // Append(vec)
-
- inline TValue& AppendAll(std::initializer_list<TValue> coll);
-
+
+ inline TValue& AppendAll(std::initializer_list<TValue> coll);
+
TValue& GetOrAdd(ui16 idx) {
return GetOrAddUnsafe(idx);
} // creates missing values, returns new child
-
- inline TValue& InsertUnsafe(size_t idx); // creates missing values, returns new child
-
- template <class T>
- TValue& InsertUnsafe(size_t idx, T&& t) {
- return InsertUnsafe(idx) = std::forward<T>(t);
- } // creates missing values, returns new child
-
+
+ inline TValue& InsertUnsafe(size_t idx); // creates missing values, returns new child
+
+ template <class T>
+ TValue& InsertUnsafe(size_t idx, T&& t) {
+ return InsertUnsafe(idx) = std::forward<T>(t);
+ } // creates missing values, returns new child
+
inline TValue& GetOrAddUnsafe(size_t idx); // creates missing values, returns new child
-
+
inline TValue Pop(); // returns popped value
- inline TValue Delete(size_t idx); // returns deleted value if it existed, NSc::Null() otherwise
-
+ inline TValue Delete(size_t idx); // returns deleted value if it existed, NSc::Null() otherwise
+
inline TValue& Front() {
return GetOrAdd(0);
} // creates missing value, returns child
inline const TValue& Front() const {
return Get(0);
} // returns child or default
-
- inline TValue& Back(); // creates missing value, returns child
- inline const TValue& Back() const; // returns child or default
-
- // todo: remove
- inline bool ArrayEmpty() const;
- inline size_t ArraySize() const;
-
- public: // Dict methods
- inline bool IsDict() const;
-
- inline const TDict& GetDict() const;
+
+ inline TValue& Back(); // creates missing value, returns child
+ inline const TValue& Back() const; // returns child or default
+
+ // todo: remove
+ inline bool ArrayEmpty() const;
+ inline size_t ArraySize() const;
+
+ public: // Dict methods
+ inline bool IsDict() const;
+
+ inline const TDict& GetDict() const;
inline TDict& GetDictMutable();
- inline TValue& SetDict(); // turns into dict if not one, returns self
- inline TValue& ClearDict();
-
- inline bool Has(TStringBuf idx) const;
-
- inline const TValue& Get(TStringBuf idx) const;
+ inline TValue& SetDict(); // turns into dict if not one, returns self
+ inline TValue& ClearDict();
+
+ inline bool Has(TStringBuf idx) const;
+
+ inline const TValue& Get(TStringBuf idx) const;
inline TValue* GetNoAdd(TStringBuf idx); // returns link to existing child or nullptr
-
+
TValue& Add(TStringBuf idx) {
return GetOrAdd(idx);
}
-
- template <class T>
- TValue& Add(TStringBuf idx, T&& t) {
- return Add(idx) = std::forward<T>(t);
+
+ template <class T>
+ TValue& Add(TStringBuf idx, T&& t) {
+ return Add(idx) = std::forward<T>(t);
}
-
- inline TValue& GetOrAdd(TStringBuf idx); // creates missing value, returns child
-
- inline TValue Delete(TStringBuf idx); // returns deleted value
-
- inline TValue& AddAll(std::initializer_list<std::pair<TStringBuf, TValue>> t);
-
- TStringBufs DictKeys(bool sorted = true) const;
- TStringBufs& DictKeys(TStringBufs&, bool sorted = true) const;
-
- // todo: remove
- inline bool DictEmpty() const;
- inline size_t DictSize() const;
-
- public: // Json methods ////////////////////////////////////////////////
- using TJsonOpts = NSc::TJsonOpts;
- using EJsonOpts = TJsonOpts::EJsonOpts;
- static const EJsonOpts JO_DEFAULT = TJsonOpts::JO_DEFAULT;
- static const EJsonOpts JO_SORT_KEYS = TJsonOpts::JO_SORT_KEYS;
- static const EJsonOpts JO_SKIP_UNSAFE = TJsonOpts::JO_SKIP_UNSAFE; // skip non-utf8 strings
- static const EJsonOpts JO_PRETTY = TJsonOpts::JO_PRETTY;
+
+ inline TValue& GetOrAdd(TStringBuf idx); // creates missing value, returns child
+
+ inline TValue Delete(TStringBuf idx); // returns deleted value
+
+ inline TValue& AddAll(std::initializer_list<std::pair<TStringBuf, TValue>> t);
+
+ TStringBufs DictKeys(bool sorted = true) const;
+ TStringBufs& DictKeys(TStringBufs&, bool sorted = true) const;
+
+ // todo: remove
+ inline bool DictEmpty() const;
+ inline size_t DictSize() const;
+
+ public: // Json methods ////////////////////////////////////////////////
+ using TJsonOpts = NSc::TJsonOpts;
+ using EJsonOpts = TJsonOpts::EJsonOpts;
+ static const EJsonOpts JO_DEFAULT = TJsonOpts::JO_DEFAULT;
+ static const EJsonOpts JO_SORT_KEYS = TJsonOpts::JO_SORT_KEYS;
+ static const EJsonOpts JO_SKIP_UNSAFE = TJsonOpts::JO_SKIP_UNSAFE; // skip non-utf8 strings
+ static const EJsonOpts JO_PRETTY = TJsonOpts::JO_PRETTY;
static const EJsonOpts JO_SAFE = TJsonOpts::JO_SAFE; // JO_SORT_KEYS | JO_SKIP_UNSAFE
- static const EJsonOpts JO_PARSER_STRICT_WITH_COMMENTS = TJsonOpts::JO_PARSER_STRICT_WITH_COMMENTS; // strict json + strict utf8
+ static const EJsonOpts JO_PARSER_STRICT_WITH_COMMENTS = TJsonOpts::JO_PARSER_STRICT_WITH_COMMENTS; // strict json + strict utf8
static const EJsonOpts JO_PARSER_STRICT = TJsonOpts::JO_PARSER_STRICT; // strict json + strict utf8 + comments are disallowed
static const EJsonOpts JO_PARSER_DISALLOW_DUPLICATE_KEYS = TJsonOpts::JO_PARSER_DISALLOW_DUPLICATE_KEYS;
-
- static TValue FromJson(TStringBuf, const TJsonOpts& = TJsonOpts());
- static TValue FromJsonThrow(TStringBuf, const TJsonOpts& = TJsonOpts());
- static bool FromJson(TValue&, TStringBuf, const TJsonOpts& = TJsonOpts());
-
- // TODO: Переименовать ToJson в ToJsonUnsafe, а ToJsonSafe в ToJson
+
+ static TValue FromJson(TStringBuf, const TJsonOpts& = TJsonOpts());
+ static TValue FromJsonThrow(TStringBuf, const TJsonOpts& = TJsonOpts());
+ static bool FromJson(TValue&, TStringBuf, const TJsonOpts& = TJsonOpts());
+
+ // TODO: Переименовать ToJson в ToJsonUnsafe, а ToJsonSafe в ToJson
TString ToJson(const TJsonOpts& = TJsonOpts()) const;
const TValue& ToJson(IOutputStream&, const TJsonOpts& = TJsonOpts()) const; // returns self
-
- // ToJson(JO_SORT_KEYS | JO_SKIP_UNSAFE)
+
+ // ToJson(JO_SORT_KEYS | JO_SKIP_UNSAFE)
TString ToJsonSafe(const TJsonOpts& = TJsonOpts()) const;
const TValue& ToJsonSafe(IOutputStream&, const TJsonOpts& = TJsonOpts()) const;
-
- // ToJson(JO_SORT_KEYS | JO_PRETTY | JO_SKIP_UNSAFE)
- TString ToJsonPretty(const TJsonOpts& = TJsonOpts()) const;
+
+ // ToJson(JO_SORT_KEYS | JO_PRETTY | JO_SKIP_UNSAFE)
+ TString ToJsonPretty(const TJsonOpts& = TJsonOpts()) const;
const TValue& ToJsonPretty(IOutputStream&, const TJsonOpts& = TJsonOpts()) const;
-
- NJson::TJsonValue ToJsonValue() const;
-
- static TValue FromJsonValue(const NJson::TJsonValue&);
- static TValue& FromJsonValue(TValue&, const NJson::TJsonValue&); // returns self
-
- static TJsonOpts MakeOptsSafeForSerializer(TJsonOpts = TJsonOpts());
- static TJsonOpts MakeOptsPrettyForSerializer(TJsonOpts = TJsonOpts());
-
- public: // Merge methods ////////////////////////////////////////////////
+
+ NJson::TJsonValue ToJsonValue() const;
+
+ static TValue FromJsonValue(const NJson::TJsonValue&);
+ static TValue& FromJsonValue(TValue&, const NJson::TJsonValue&); // returns self
+
+ static TJsonOpts MakeOptsSafeForSerializer(TJsonOpts = TJsonOpts());
+ static TJsonOpts MakeOptsPrettyForSerializer(TJsonOpts = TJsonOpts());
+
+ public: // Merge methods ////////////////////////////////////////////////
/*
- * LHS.MergeUpdate(RHS):
- * 1. Dict <- Dict:
- * - Copy all nonconflicting key-value pairs from RHS to LHS.
- * - For every pair of conflicting values apply LHS[key].MergeUpdate(RHS[key]).
- * 2. Anything <- Null:
- * - Do nothing.
- * 3. Other conflicts:
- * - Copy RHS over LHS.
- *
- * LHS.ReverseMerge(RHS):
- * 1. Dict <- Dict:
- * - Copy all nonconflicting key-value pairs from RHS to LHS.
- * - For every pair of conflicting values apply LHS[key].ReverseMerge(RHS[key]).
- * 2. Null <- Anything:
- * - Copy RHS over LHS.
- * 3. Other conflicts:
- * - Do nothing.
- */
-
- TValue& MergeUpdateJson(TStringBuf json); // returns self
- TValue& ReverseMergeJson(TStringBuf json); // returns self
-
- static bool MergeUpdateJson(TValue&, TStringBuf json); // returns true unless failed to parse the json
- static bool ReverseMergeJson(TValue&, TStringBuf json); // returns true unless failed to parse the json
-
+ * LHS.MergeUpdate(RHS):
+ * 1. Dict <- Dict:
+ * - Copy all nonconflicting key-value pairs from RHS to LHS.
+ * - For every pair of conflicting values apply LHS[key].MergeUpdate(RHS[key]).
+ * 2. Anything <- Null:
+ * - Do nothing.
+ * 3. Other conflicts:
+ * - Copy RHS over LHS.
+ *
+ * LHS.ReverseMerge(RHS):
+ * 1. Dict <- Dict:
+ * - Copy all nonconflicting key-value pairs from RHS to LHS.
+ * - For every pair of conflicting values apply LHS[key].ReverseMerge(RHS[key]).
+ * 2. Null <- Anything:
+ * - Copy RHS over LHS.
+ * 3. Other conflicts:
+ * - Do nothing.
+ */
+
+ TValue& MergeUpdateJson(TStringBuf json); // returns self
+ TValue& ReverseMergeJson(TStringBuf json); // returns self
+
+ static bool MergeUpdateJson(TValue&, TStringBuf json); // returns true unless failed to parse the json
+ static bool ReverseMergeJson(TValue&, TStringBuf json); // returns true unless failed to parse the json
+
TValue& MergeUpdate(const TValue& delta); // return self
- TValue& ReverseMerge(const TValue& delta); // return self
-
- public: // Path methods /////////////////////////////////////////////////////////
- // TODO: add throwing variants
- // make sure to properly escape the tokens
-
+ TValue& ReverseMerge(const TValue& delta); // return self
+
+ public: // Path methods /////////////////////////////////////////////////////////
+ // TODO: add throwing variants
+ // make sure to properly escape the tokens
+
static TString EscapeForPath(TStringBuf rawKey); // converts a raw dict key into a valid token for a selector path
-
+
static bool PathValid(TStringBuf path); // returns true if the path is syntactically valid
-
+
bool PathExists(TStringBuf path) const; // returns true if the path is syntactically valid and the target value exists
-
- const TValue& TrySelect(TStringBuf path) const; // returns the target value
- // if the path is syntactically valid and the target value exists
- // otherwise returns NSc::Null()
-
+
+ const TValue& TrySelect(TStringBuf path) const; // returns the target value
+ // if the path is syntactically valid and the target value exists
+ // otherwise returns NSc::Null()
+
TValue* TrySelectOrAdd(TStringBuf path); // returns the target value if it exists or creates if not
- // if the path is syntactically valid
- // otherwise returns NSc::Null()
-
- TValue TrySelectAndDelete(TStringBuf path); // deletes and returns the target value
- // if the path is syntactically valid and the target value existed
- // otherwise returns NSc::Null()
-
+ // if the path is syntactically valid
+ // otherwise returns NSc::Null()
+
+ TValue TrySelectAndDelete(TStringBuf path); // deletes and returns the target value
+ // if the path is syntactically valid and the target value existed
+ // otherwise returns NSc::Null()
+
public: // Copy methods /////////////////////////////////////////////////////////
TValue Clone() const; // returns deep copy of self (on the separate pool)
- TValue& CopyFrom(const TValue& other); // deep copy other value into self, returns self
-
- TValue& Swap(TValue& v);
-
+ TValue& CopyFrom(const TValue& other); // deep copy other value into self, returns self
+
+ TValue& Swap(TValue& v);
+
static bool Same(const TValue&, const TValue&); // point to the same core
static bool Equal(const TValue&, const TValue&); // recursively equal
- static bool SamePool(const TValue&, const TValue&); // share arena
-
- public:
- // very specific methods useful in very specific corner cases
+ static bool SamePool(const TValue&, const TValue&); // share arena
+
+ public:
+ // very specific methods useful in very specific corner cases
static TValue From(const ::google::protobuf::Message&, bool mapAsDict = false);
-
+
void To(::google::protobuf::Message&, const TProtoOpts& opts = {}) const;
- public:
- inline explicit TValue(TPoolPtr&);
-
- static const TScCore& DefaultCore();
- static const TArray& DefaultArray();
+ public:
+ inline explicit TValue(TPoolPtr&);
+
+ static const TScCore& DefaultCore();
+ static const TArray& DefaultArray();
static const TDict& DefaultDict();
- static const TValue& DefaultValue();
+ static const TValue& DefaultValue();
static const TValue& Null() {
return DefaultValue();
}
-
+
void DoWriteJsonImpl(IOutputStream&, const TJsonOpts&, NImpl::TKeySortContext&, NImpl::TSelfLoopContext&) const;
-
- bool IsSameOrAncestorOf(const TValue& other) const;
-
- private:
- TValue& DoMerge(const TValue& delta, bool olddelta);
- TValue& DoMergeImpl(const TValue& delta, bool olddelta, NImpl::TSelfLoopContext&, NImpl::TSelfOverrideContext&);
- TValue& DoCopyFromImpl(const TValue& other, NImpl::TSelfLoopContext&, NImpl::TSelfOverrideContext&);
- NJson::TJsonValue ToJsonValueImpl(NImpl::TSelfLoopContext&) const;
-
- bool IsSameOrAncestorOfImpl(const TScCore& other, NImpl::TSelfLoopContext& loopCtx) const;
-
- inline TScCore& CoreMutable();
+
+ bool IsSameOrAncestorOf(const TValue& other) const;
+
+ private:
+ TValue& DoMerge(const TValue& delta, bool olddelta);
+ TValue& DoMergeImpl(const TValue& delta, bool olddelta, NImpl::TSelfLoopContext&, NImpl::TSelfOverrideContext&);
+ TValue& DoCopyFromImpl(const TValue& other, NImpl::TSelfLoopContext&, NImpl::TSelfOverrideContext&);
+ NJson::TJsonValue ToJsonValueImpl(NImpl::TSelfLoopContext&) const;
+
+ bool IsSameOrAncestorOfImpl(const TScCore& other, NImpl::TSelfLoopContext& loopCtx) const;
+
+ inline TScCore& CoreMutable();
inline TScCore& CoreMutableForSet();
- inline const TScCore& Core() const;
-
- static inline TScCore* NewCore(TPoolPtr&);
-
- static TValue FromField(const ::google::protobuf::Message&, const ::google::protobuf::FieldDescriptor*);
- static TValue FromRepeatedField(const ::google::protobuf::Message&, const ::google::protobuf::FieldDescriptor*, int index);
+ inline const TScCore& Core() const;
+
+ static inline TScCore* NewCore(TPoolPtr&);
+
+ static TValue FromField(const ::google::protobuf::Message&, const ::google::protobuf::FieldDescriptor*);
+ static TValue FromRepeatedField(const ::google::protobuf::Message&, const ::google::protobuf::FieldDescriptor*, int index);
void ValueToField(const TValue& value, ::google::protobuf::Message&, const ::google::protobuf::FieldDescriptor*, const TProtoOpts& opts) const;
void ToField(::google::protobuf::Message&, const ::google::protobuf::FieldDescriptor*, const TProtoOpts& opts) const;
void ToEnumField(::google::protobuf::Message&, const ::google::protobuf::FieldDescriptor*, const TProtoOpts& opts) const;
void ToRepeatedField(::google::protobuf::Message&, const ::google::protobuf::FieldDescriptor*, const TProtoOpts& opts) const;
void ToMapField(::google::protobuf::Message&, const ::google::protobuf::FieldDescriptor*, const TProtoOpts& opts) const;
- };
-
-
- inline const TValue& Null() {
- return TValue::DefaultValue();
- }
-
-
+ };
+
+
+ inline const TValue& Null() {
+ return TValue::DefaultValue();
+ }
+
+
class TArray: public TDeque<TValue, TPoolAllocator>, TNonCopyable {
using TParent = TDeque<TValue, TPoolAllocator>;
-
- public:
- TArray(TMemoryPool* p)
- : TParent(p)
+
+ public:
+ TArray(TMemoryPool* p)
+ : TParent(p)
{
}
-
- template <class TIt>
- void AppendAll(TIt begin, TIt end) {
- TParent::insert(TParent::end(), begin, end);
- }
-
- template <class TColl>
- void AppendAll(TColl&& coll) {
- AppendAll(std::begin(coll), std::end(coll));
- }
-
- void AppendAll(std::initializer_list<TValue> coll) {
- AppendAll(coll.begin(), coll.end());
- }
-
- const TValue& operator[](size_t i) const {
- return EnsureIndex(i);
- }
-
- TValue& operator[](size_t i) {
- return EnsureIndex(i);
- }
-
- const TValue& front() const {
- return EnsureIndex(0);
- }
-
- TValue& front() {
- return EnsureIndex(0);
- }
-
- const TValue& back() const {
- return EnsureIndex(LastIndex());
- }
-
- TValue& back() {
- return EnsureIndex(LastIndex());
- }
-
- void pop_back() {
- if (empty())
- return;
- TParent::pop_back();
- }
-
- void pop_front() {
- if (empty())
- return;
- TParent::pop_front();
- }
-
- private:
- size_t LastIndex() const {
- return ::Max<size_t>(size(), 1) - 1;
- }
-
- TValue& EnsureIndex(size_t i) {
- if (i >= size())
- resize(::Min<size_t>(i + 1, ::Max<ui16>()), TValue::DefaultValue());
- return TParent::operator[](i);
- }
-
- const TValue& EnsureIndex(size_t i) const {
+
+ template <class TIt>
+ void AppendAll(TIt begin, TIt end) {
+ TParent::insert(TParent::end(), begin, end);
+ }
+
+ template <class TColl>
+ void AppendAll(TColl&& coll) {
+ AppendAll(std::begin(coll), std::end(coll));
+ }
+
+ void AppendAll(std::initializer_list<TValue> coll) {
+ AppendAll(coll.begin(), coll.end());
+ }
+
+ const TValue& operator[](size_t i) const {
+ return EnsureIndex(i);
+ }
+
+ TValue& operator[](size_t i) {
+ return EnsureIndex(i);
+ }
+
+ const TValue& front() const {
+ return EnsureIndex(0);
+ }
+
+ TValue& front() {
+ return EnsureIndex(0);
+ }
+
+ const TValue& back() const {
+ return EnsureIndex(LastIndex());
+ }
+
+ TValue& back() {
+ return EnsureIndex(LastIndex());
+ }
+
+ void pop_back() {
+ if (empty())
+ return;
+ TParent::pop_back();
+ }
+
+ void pop_front() {
+ if (empty())
+ return;
+ TParent::pop_front();
+ }
+
+ private:
+ size_t LastIndex() const {
+ return ::Max<size_t>(size(), 1) - 1;
+ }
+
+ TValue& EnsureIndex(size_t i) {
+ if (i >= size())
+ resize(::Min<size_t>(i + 1, ::Max<ui16>()), TValue::DefaultValue());
+ return TParent::operator[](i);
+ }
+
+ const TValue& EnsureIndex(size_t i) const {
return i < size() ? TParent::operator[](i) : TValue::DefaultValue();
- }
- };
-
-
- // todo: densehashtable
- // todo: allow insertions
- // todo: make TDict methods safe
+ }
+ };
+
+
+ // todo: densehashtable
+ // todo: allow insertions
+ // todo: make TDict methods safe
class TDict: public THashMap<TStringBuf, TValue, THash<TStringBuf>, TEqualTo<TStringBuf>, TPoolAllocator>, TNonCopyable {
using TParent = THashMap<TStringBuf, TValue, THash<TStringBuf>, TEqualTo<TStringBuf>, TPoolAllocator>;
- public:
- TDict(TMemoryPool* p)
- : TParent(p)
+ public:
+ TDict(TMemoryPool* p)
+ : TParent(p)
{
}
-
- template <class TStr>
- const TValue& Get(const TStr& key) const {
- const_iterator it = find(key);
- return it != end() ? it->second : TValue::DefaultValue();
- }
- };
-}
-
-#include "scimpl.h"
+
+ template <class TStr>
+ const TValue& Get(const TStr& key) const {
+ const_iterator it = find(key);
+ return it != end() ? it->second : TValue::DefaultValue();
+ }
+ };
+}
+
+#include "scimpl.h"
#include "scheme_cast.h"
#ifdef _MSC_VER