OLD | NEW |
| (Empty) |
1 #pragma once | |
2 #include "my_json.h" | |
3 #include <iostream> | |
4 #include <sstream> | |
5 | |
6 namespace json { | |
7 class StructFieldDefinition { | |
8 public: | |
9 enum Type {FT_INT, FT_ENUM, FT_FLAGS, FT_PTR, FT_STR, FT_USTR, FT_HANDLE}; | |
10 | |
11 StructFieldDefinition(const std::string& name, Type type, size_t size, size_t
offset, size_t unicode_offset = 0) | |
12 : name_(name), type_(type), size_(size), offset_(offset), unicode_offset_(un
icode_offset) {} | |
13 | |
14 void ParseEnumValues(const std::string& key_value_pairs); | |
15 std::string GetEnumName(long long id); | |
16 | |
17 public: | |
18 std::string name_; | |
19 Type type_; | |
20 size_t size_; | |
21 size_t offset_; | |
22 size_t unicode_offset_; | |
23 std::map<long long, std::string> enum_values_; | |
24 }; | |
25 | |
26 class StructDefinition { | |
27 public: | |
28 StructDefinition(const std::string& name) : name_(name) {} | |
29 ~StructDefinition(); | |
30 | |
31 void AddFieldDefinition(StructFieldDefinition* def); | |
32 size_t GetFieldNum() const; | |
33 StructFieldDefinition* GetFieldDefinition(size_t pos); | |
34 StructFieldDefinition* GetFieldDefinition(const std::string& name); | |
35 | |
36 public: | |
37 std::string name_; | |
38 std::deque<StructFieldDefinition*> fields_; | |
39 }; | |
40 | |
41 class StructDefinitions { | |
42 public: | |
43 StructDefinitions(); | |
44 ~StructDefinitions(); | |
45 | |
46 void AddStructDefinition(StructDefinition* def); | |
47 StructDefinition* FindStructDefinition(const std::string& name); | |
48 | |
49 public: | |
50 std::map<std::string, StructDefinition*> structs_; | |
51 }; | |
52 | |
53 class StructTextCreator : public Visitor { | |
54 public: | |
55 StructTextCreator(); | |
56 ~StructTextCreator(); | |
57 | |
58 void SetGenerateComments(bool on, StructDefinitions* struct_defs); | |
59 void CreateText(const Value& value_in, std::string* text_out); | |
60 | |
61 virtual void Visit(Null& element); | |
62 virtual void Visit(Number& element); | |
63 virtual void Visit(Boolean& element); | |
64 virtual void Visit(String& element); | |
65 virtual void Visit(Blob& element); | |
66 virtual void Visit(Array& element); | |
67 virtual void Visit(Object& element); | |
68 | |
69 protected: | |
70 void OutputObject(int offset, Object& value_in, std::ostringstream* buff_out)
; | |
71 void OutputValue(int offset, Value& value_in, std::ostringstream* buff_out); | |
72 void OutputOffset(int offset, std::ostringstream* buff_out); | |
73 std::string CreateCommentFor(Value* prop, StructFieldDefinition* fd_def); | |
74 | |
75 bool generate_comments_; | |
76 StructDefinitions* struct_defs_; | |
77 std::string comment_; | |
78 int offset_; | |
79 std::ostringstream* buff_out_; | |
80 }; | |
81 | |
82 Value* CreateValueFromStructField(const void* struct_ptr, const char* struct_nam
e, StructFieldDefinition& field_def); | |
83 Object* CreateFromStruct(const void* struct_ptr, const char* struct_name, Struct
Definitions& defs); | |
84 void AddIntConst(int id, const char* name, std::string* str); | |
85 | |
86 #define START_STRUCT_DEF(T) do { json::StructDefinition* sd = new json::StructDe
finition(#T); T tmp | |
87 | |
88 #define OFFSET_OF(Name) ((char*)&tmp.Name - (char*)&tmp) | |
89 | |
90 #define DEF_ENUM_FIELD(Name, Values) do {\ | |
91 json::StructFieldDefinition* def = new json::StructFieldDefinition(#Name, json
::StructFieldDefinition::FT_ENUM, sizeof(tmp.Name), OFFSET_OF(Name));\ | |
92 def->ParseEnumValues(Values); sd->AddFieldDefinition(def); } while(false) | |
93 | |
94 #define DEF_HANDLE_FIELD(Name) \ | |
95 sd->AddFieldDefinition(new json::StructFieldDefinition(#Name, json::StructFiel
dDefinition::FT_HANDLE, sizeof(tmp.Name), OFFSET_OF(Name))) | |
96 | |
97 #define DEF_PTR_FIELD(Name) \ | |
98 sd->AddFieldDefinition(new json::StructFieldDefinition(#Name, json::StructFiel
dDefinition::FT_PTR, sizeof(tmp.Name), OFFSET_OF(Name))) | |
99 | |
100 #define DEF_STR_FIELD(Name) \ | |
101 sd->AddFieldDefinition(new json::StructFieldDefinition(#Name, json::StructFiel
dDefinition::FT_STR, sizeof(tmp.Name), OFFSET_OF(Name))) | |
102 | |
103 #define DEF_INT_FIELD(Name) \ | |
104 sd->AddFieldDefinition(new json::StructFieldDefinition(#Name, json::StructFiel
dDefinition::FT_INT, sizeof(tmp.Name), OFFSET_OF(Name))) | |
105 | |
106 #define DEF_USTR_FIELD(Name, FUnicode) \ | |
107 sd->AddFieldDefinition(new json::StructFieldDefinition(#Name, json::StructFiel
dDefinition::FT_USTR, sizeof(tmp.Name), OFFSET_OF(Name), OFFSET_OF(FUnicode))) | |
108 | |
109 #define STOP_STRUCT_DEF defs->AddStructDefinition(sd); } while(false) | |
110 | |
111 #define ADD_INT_C(x, str) json::AddIntConst(x, #x, &str) | |
112 | |
113 } // namespace json | |
OLD | NEW |