#pragma once #include "public.h" #include #include #include namespace NSkiff { //////////////////////////////////////////////////////////////////////////////// template class TComplexSchema; using TTupleSchema = TComplexSchema; using TVariant8Schema = TComplexSchema; using TVariant16Schema = TComplexSchema; using TRepeatedVariant8Schema = TComplexSchema; using TRepeatedVariant16Schema = TComplexSchema; using TTupleSchemaPtr = std::shared_ptr; using TVariant8SchemaPtr = std::shared_ptr; using TVariant16SchemaPtr = std::shared_ptr; using TRepeatedVariant8SchemaPtr = std::shared_ptr; using TRepeatedVariant16SchemaPtr = std::shared_ptr; //////////////////////////////////////////////////////////////////////////////// class TSkiffSchema : public std::enable_shared_from_this { public: virtual ~TSkiffSchema() = default; EWireType GetWireType() const; std::shared_ptr SetName(TString name); const TString& GetName() const; virtual const TSkiffSchemaList& GetChildren() const; protected: explicit TSkiffSchema(EWireType type); private: const EWireType Type_; TString Name_; }; bool operator==(const TSkiffSchema& lhs, const TSkiffSchema& rhs); bool operator!=(const TSkiffSchema& lhs, const TSkiffSchema& rhs); //////////////////////////////////////////////////////////////////////////////// class TSimpleTypeSchema : public TSkiffSchema { public: explicit TSimpleTypeSchema(EWireType type); }; //////////////////////////////////////////////////////////////////////////////// template class TComplexSchema : public TSkiffSchema { public: explicit TComplexSchema(TSkiffSchemaList elements); virtual const TSkiffSchemaList& GetChildren() const override; private: const TSkiffSchemaList Elements_; }; //////////////////////////////////////////////////////////////////////////////// bool IsSimpleType(EWireType type); TString GetShortDebugString(const std::shared_ptr& schema); void PrintShortDebugString(const std::shared_ptr& schema, IOutputStream* out); std::shared_ptr CreateSimpleTypeSchema(EWireType type); std::shared_ptr CreateTupleSchema(TSkiffSchemaList children); std::shared_ptr CreateVariant8Schema(TSkiffSchemaList children); std::shared_ptr CreateVariant16Schema(TSkiffSchemaList children); std::shared_ptr CreateRepeatedVariant8Schema(TSkiffSchemaList children); std::shared_ptr CreateRepeatedVariant16Schema(TSkiffSchemaList children); //////////////////////////////////////////////////////////////////////////////// struct TSkiffSchemaPtrHasher { size_t operator()(const std::shared_ptr& schema) const; }; struct TSkiffSchemaPtrEqual { size_t operator()( const std::shared_ptr& lhs, const std::shared_ptr& rhs) const; }; } // namespace NSkiff //////////////////////////////////////////////////////////////////////////////// template <> struct THash { size_t operator()(const NSkiff::TSkiffSchema& schema) const; }; //////////////////////////////////////////////////////////////////////////////// #define SKIFF_SCHEMA_H #include "skiff_schema-inl.h" #undef SKIFF_SCHEMA_H