#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include namespace NSc { namespace NDefinitions { const size_t POOL_BLOCK_SIZE = 4000; // leave 96 bytes for overhead struct TPool: public TAtomicRefCount { TMemoryPool Pool; TPool(size_t blsz = POOL_BLOCK_SIZE, TMemoryPool::IGrowPolicy* grow = TMemoryPool::TExpGrow::Instance()) : Pool(blsz, grow) { } TMemoryPool* Get() { return &Pool; } TStringBuf AppendBuf(const TStringBuf& strb) { return Pool.AppendCString(strb); } template T* NewWithPool() { return new (Pool.Allocate()) T(&Pool); } }; } using TStringBufs = TVector; class TSchemeException : public yexception { }; class TSchemeParseException : public TSchemeException { public: size_t Offset = 0; TString Reason; public: TSchemeParseException() = default; TSchemeParseException(size_t off, const TString& reason) : Offset(off) , Reason(reason) { } }; struct TJsonOpts: public NJson::TJsonReaderConfig { enum EJsonOpts { JO_DEFAULT = 0, // just dump json, used to be default, actually JO_SORT_KEYS = 1, // sort dict keys to make output more predictable JO_SKIP_UNSAFE = 2, // skip nonunicode data to make external json parsers happy // will skip nonunicode dict keys and replace nonunicode values with nulls JO_FORMAT = 8, // format json JO_PARSER_STRICT_JSON = 16, // strict standard json JO_PARSER_STRICT_UTF8 = 32, // strict utf8 JO_PARSER_DISALLOW_COMMENTS = 64, JO_PARSER_DISALLOW_DUPLICATE_KEYS = 128, JO_PRETTY = JO_FORMAT | JO_SORT_KEYS, // pretty print json JO_SAFE = JO_SKIP_UNSAFE | JO_SORT_KEYS, // ensure standard parser-safe json JO_PARSER_STRICT_WITH_COMMENTS = JO_PARSER_STRICT_JSON | JO_PARSER_STRICT_UTF8, JO_PARSER_STRICT = JO_PARSER_STRICT_JSON | JO_PARSER_STRICT_UTF8 | JO_PARSER_DISALLOW_COMMENTS, }; public: TJsonOpts(int opts = JO_SORT_KEYS) : Opts(opts) , SortKeys(opts & JO_SORT_KEYS) , FormatJson(opts & JO_FORMAT) , StringPolicy((opts & JO_SKIP_UNSAFE) ? StringPolicySafe : StringPolicyUnsafe) { AllowComments = !(opts & JO_PARSER_DISALLOW_COMMENTS); RelaxedJson = !(opts & JO_PARSER_STRICT_JSON); DontValidateUtf8 = !(opts & JO_PARSER_STRICT_UTF8); } public: bool RelaxedJson = false; int Opts = 0; bool SortKeys = true; bool FormatJson = false; // return true to proceed with output, false to skip, optionally modify value std::function NumberPolicy = NumberPolicySafe; std::function StringPolicy = StringPolicyUnsafe; public: static bool NumberPolicySafe(double&); // skip if nan or inf static bool NumberPolicyUnsafe(double&) { return true; } static bool StringPolicySafe(TStringBuf&); // skip if not utf8 static bool StringPolicyUnsafe(TStringBuf&) { return true; } }; struct TProtoOpts { // Serialization throws on unknown enum value if not set, else use default value bool UnknownEnumValueIsDefault = false; // Serialization throws on type mismatch if not set, else leaves protobuf empty bool SkipTypeMismatch = false; }; namespace NImpl { class TKeySortContext; class TSelfLoopContext; class TSelfOverrideContext; } } namespace google { namespace protobuf { class Message; class FieldDescriptor; } }