/root/doris/be/src/util/easy_json.cc
Line | Count | Source (jump to first uncovered line) |
1 | | // Licensed to the Apache Software Foundation (ASF) under one |
2 | | // or more contributor license agreements. See the NOTICE file |
3 | | // distributed with this work for additional information |
4 | | // regarding copyright ownership. The ASF licenses this file |
5 | | // to you under the Apache License, Version 2.0 (the |
6 | | // "License"); you may not use this file except in compliance |
7 | | // with the License. You may obtain a copy of the License at |
8 | | // |
9 | | // http://www.apache.org/licenses/LICENSE-2.0 |
10 | | // |
11 | | // Unless required by applicable law or agreed to in writing, |
12 | | // software distributed under the License is distributed on an |
13 | | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
14 | | // KIND, either express or implied. See the License for the |
15 | | // specific language governing permissions and limitations |
16 | | // under the License. |
17 | | |
18 | | #include "util/easy_json.h" |
19 | | |
20 | | #include <glog/logging.h> |
21 | | #include <rapidjson/allocators.h> |
22 | | #include <rapidjson/document.h> |
23 | | #include <rapidjson/rapidjson.h> |
24 | | #include <rapidjson/stringbuffer.h> |
25 | | #include <rapidjson/writer.h> |
26 | | |
27 | | #include <ostream> |
28 | | #include <string> |
29 | | #include <utility> |
30 | | // IWYU pragma: no_include <rapidjson/encodings.h> |
31 | | |
32 | | using rapidjson::SizeType; |
33 | | using rapidjson::Value; |
34 | | using std::string; |
35 | | |
36 | | namespace doris { |
37 | | |
38 | 5 | EasyJson::EasyJson() : alloc_(new EasyJsonAllocator), value_(&alloc_->value()) {} |
39 | | |
40 | | EasyJson::EasyJson(EasyJson::ComplexTypeInitializer type) |
41 | 0 | : alloc_(new EasyJsonAllocator), value_(&alloc_->value()) { |
42 | 0 | if (type == kObject) { |
43 | 0 | value_->SetObject(); |
44 | 0 | } else if (type == kArray) { |
45 | 0 | value_->SetArray(); |
46 | 0 | } |
47 | 0 | } |
48 | | |
49 | 14 | EasyJson EasyJson::Get(const string& key) { |
50 | 14 | if (!value_->IsObject()) { |
51 | 4 | value_->SetObject(); |
52 | 4 | } |
53 | 14 | if (!value_->HasMember(key.c_str())) { |
54 | 9 | Value key_val(key.c_str(), alloc_->allocator()); |
55 | 9 | value_->AddMember(key_val, Value().SetNull(), alloc_->allocator()); |
56 | 9 | } |
57 | 14 | return EasyJson(&(*value_)[key.c_str()], alloc_); |
58 | 14 | } |
59 | | |
60 | 3 | EasyJson EasyJson::Get(int index) { |
61 | 3 | if (!value_->IsArray()) { |
62 | 1 | value_->SetArray(); |
63 | 1 | } |
64 | 5 | while (SizeType(index) >= value_->Size()) { |
65 | 2 | value_->PushBack(Value().SetNull(), alloc_->allocator()); |
66 | 2 | } |
67 | 3 | return EasyJson(&(*value_)[index], alloc_); |
68 | 3 | } |
69 | | |
70 | 7 | EasyJson EasyJson::operator[](const string& key) { |
71 | 7 | return Get(key); |
72 | 7 | } |
73 | | |
74 | 3 | EasyJson EasyJson::operator[](int index) { |
75 | 3 | return Get(index); |
76 | 3 | } |
77 | | |
78 | 0 | EasyJson& EasyJson::operator=(const string& val) { |
79 | 0 | value_->SetString(val.c_str(), alloc_->allocator()); |
80 | 0 | return *this; |
81 | 0 | } |
82 | | template <typename T> |
83 | 5 | EasyJson& EasyJson::operator=(T val) { |
84 | 5 | *value_ = val; |
85 | 5 | return *this; |
86 | 5 | } _ZN5doris8EasyJsonaSIbEERS0_T_ Line | Count | Source | 83 | 2 | EasyJson& EasyJson::operator=(T val) { | 84 | 2 | *value_ = val; | 85 | 2 | return *this; | 86 | 2 | } |
_ZN5doris8EasyJsonaSIiEERS0_T_ Line | Count | Source | 83 | 3 | EasyJson& EasyJson::operator=(T val) { | 84 | 3 | *value_ = val; | 85 | 3 | return *this; | 86 | 3 | } |
Unexecuted instantiation: _ZN5doris8EasyJsonaSIlEERS0_T_ Unexecuted instantiation: _ZN5doris8EasyJsonaSIjEERS0_T_ Unexecuted instantiation: _ZN5doris8EasyJsonaSImEERS0_T_ Unexecuted instantiation: _ZN5doris8EasyJsonaSIdEERS0_T_ |
87 | | template EasyJson& EasyJson::operator=(bool val); |
88 | | template EasyJson& EasyJson::operator=(int32_t val); |
89 | | template EasyJson& EasyJson::operator=(int64_t val); |
90 | | template EasyJson& EasyJson::operator=(uint32_t val); |
91 | | template EasyJson& EasyJson::operator=(uint64_t val); |
92 | | template EasyJson& EasyJson::operator=(double val); |
93 | | template <> |
94 | 0 | EasyJson& EasyJson::operator=(const char* val) { |
95 | 0 | value_->SetString(val, alloc_->allocator()); |
96 | 0 | return *this; |
97 | 0 | } |
98 | | template <> |
99 | 2 | EasyJson& EasyJson::operator=(EasyJson::ComplexTypeInitializer val) { |
100 | 2 | if (val == kObject) { |
101 | 1 | value_->SetObject(); |
102 | 1 | } else if (val == kArray) { |
103 | 1 | value_->SetArray(); |
104 | 1 | } |
105 | 2 | return (*this); |
106 | 2 | } |
107 | | |
108 | | #ifdef __APPLE__ |
109 | | template <> |
110 | | EasyJson& EasyJson::operator=(unsigned long val) { |
111 | | return EasyJson::operator=(static_cast<uint64_t>(val)); |
112 | | } |
113 | | #endif |
114 | | |
115 | 2 | EasyJson& EasyJson::SetObject() { |
116 | 2 | if (!value_->IsObject()) { |
117 | 2 | value_->SetObject(); |
118 | 2 | } |
119 | 2 | return *this; |
120 | 2 | } |
121 | | |
122 | 1 | EasyJson& EasyJson::SetArray() { |
123 | 1 | if (!value_->IsArray()) { |
124 | 1 | value_->SetArray(); |
125 | 1 | } |
126 | 1 | return *this; |
127 | 1 | } |
128 | | |
129 | 0 | EasyJson EasyJson::Set(const string& key, const string& val) { |
130 | 0 | return (Get(key) = val); |
131 | 0 | } |
132 | | template <typename T> |
133 | 2 | EasyJson EasyJson::Set(const string& key, T val) { |
134 | 2 | return (Get(key) = val); |
135 | 2 | } _ZN5doris8EasyJson3SetIbEES0_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEET_ Line | Count | Source | 133 | 1 | EasyJson EasyJson::Set(const string& key, T val) { | 134 | 1 | return (Get(key) = val); | 135 | 1 | } |
Unexecuted instantiation: _ZN5doris8EasyJson3SetIiEES0_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEET_ Unexecuted instantiation: _ZN5doris8EasyJson3SetIlEES0_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEET_ Unexecuted instantiation: _ZN5doris8EasyJson3SetIjEES0_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEET_ Unexecuted instantiation: _ZN5doris8EasyJson3SetImEES0_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEET_ Unexecuted instantiation: _ZN5doris8EasyJson3SetIdEES0_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEET_ Unexecuted instantiation: _ZN5doris8EasyJson3SetIPKcEES0_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEET_ _ZN5doris8EasyJson3SetINS0_22ComplexTypeInitializerEEES0_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEET_ Line | Count | Source | 133 | 1 | EasyJson EasyJson::Set(const string& key, T val) { | 134 | 1 | return (Get(key) = val); | 135 | 1 | } |
|
136 | | template EasyJson EasyJson::Set(const string& key, bool val); |
137 | | template EasyJson EasyJson::Set(const string& key, int32_t val); |
138 | | template EasyJson EasyJson::Set(const string& key, int64_t val); |
139 | | template EasyJson EasyJson::Set(const string& key, uint32_t val); |
140 | | template EasyJson EasyJson::Set(const string& key, uint64_t val); |
141 | | template EasyJson EasyJson::Set(const string& key, double val); |
142 | | template EasyJson EasyJson::Set(const string& key, const char* val); |
143 | | template EasyJson EasyJson::Set(const string& key, EasyJson::ComplexTypeInitializer val); |
144 | | |
145 | 0 | EasyJson EasyJson::Set(int index, const string& val) { |
146 | 0 | return (Get(index) = val); |
147 | 0 | } |
148 | | template <typename T> |
149 | 0 | EasyJson EasyJson::Set(int index, T val) { |
150 | 0 | return (Get(index) = val); |
151 | 0 | } Unexecuted instantiation: _ZN5doris8EasyJson3SetIbEES0_iT_ Unexecuted instantiation: _ZN5doris8EasyJson3SetIiEES0_iT_ Unexecuted instantiation: _ZN5doris8EasyJson3SetIlEES0_iT_ Unexecuted instantiation: _ZN5doris8EasyJson3SetIjEES0_iT_ Unexecuted instantiation: _ZN5doris8EasyJson3SetImEES0_iT_ Unexecuted instantiation: _ZN5doris8EasyJson3SetIdEES0_iT_ Unexecuted instantiation: _ZN5doris8EasyJson3SetIPKcEES0_iT_ Unexecuted instantiation: _ZN5doris8EasyJson3SetINS0_22ComplexTypeInitializerEEES0_iT_ |
152 | | template EasyJson EasyJson::Set(int index, bool val); |
153 | | template EasyJson EasyJson::Set(int index, int32_t val); |
154 | | template EasyJson EasyJson::Set(int index, int64_t val); |
155 | | template EasyJson EasyJson::Set(int index, uint32_t val); |
156 | | template EasyJson EasyJson::Set(int index, uint64_t val); |
157 | | template EasyJson EasyJson::Set(int index, double val); |
158 | | template EasyJson EasyJson::Set(int index, const char* val); |
159 | | template EasyJson EasyJson::Set(int index, EasyJson::ComplexTypeInitializer val); |
160 | | |
161 | 0 | EasyJson EasyJson::PushBack(const string& val) { |
162 | 0 | if (!value_->IsArray()) { |
163 | 0 | value_->SetArray(); |
164 | 0 | } |
165 | 0 | Value push_val(val.c_str(), alloc_->allocator()); |
166 | 0 | value_->PushBack(push_val, alloc_->allocator()); |
167 | 0 | return EasyJson(&(*value_)[value_->Size() - 1], alloc_); |
168 | 0 | } |
169 | | template <typename T> |
170 | 2 | EasyJson EasyJson::PushBack(T val) { |
171 | 2 | if (!value_->IsArray()) { |
172 | 0 | value_->SetArray(); |
173 | 0 | } |
174 | 2 | value_->PushBack(val, alloc_->allocator()); |
175 | 2 | return EasyJson(&(*value_)[value_->Size() - 1], alloc_); |
176 | 2 | } Unexecuted instantiation: _ZN5doris8EasyJson8PushBackIbEES0_T_ _ZN5doris8EasyJson8PushBackIiEES0_T_ Line | Count | Source | 170 | 2 | EasyJson EasyJson::PushBack(T val) { | 171 | 2 | if (!value_->IsArray()) { | 172 | 0 | value_->SetArray(); | 173 | 0 | } | 174 | 2 | value_->PushBack(val, alloc_->allocator()); | 175 | 2 | return EasyJson(&(*value_)[value_->Size() - 1], alloc_); | 176 | 2 | } |
Unexecuted instantiation: _ZN5doris8EasyJson8PushBackIlEES0_T_ Unexecuted instantiation: _ZN5doris8EasyJson8PushBackIjEES0_T_ Unexecuted instantiation: _ZN5doris8EasyJson8PushBackImEES0_T_ Unexecuted instantiation: _ZN5doris8EasyJson8PushBackIdEES0_T_ |
177 | | template EasyJson EasyJson::PushBack(bool val); |
178 | | template EasyJson EasyJson::PushBack(int32_t val); |
179 | | template EasyJson EasyJson::PushBack(int64_t val); |
180 | | template EasyJson EasyJson::PushBack(uint32_t val); |
181 | | template EasyJson EasyJson::PushBack(uint64_t val); |
182 | | template EasyJson EasyJson::PushBack(double val); |
183 | | template <> |
184 | 0 | EasyJson EasyJson::PushBack(const char* val) { |
185 | 0 | if (!value_->IsArray()) { |
186 | 0 | value_->SetArray(); |
187 | 0 | } |
188 | 0 | Value push_val(val, alloc_->allocator()); |
189 | 0 | value_->PushBack(push_val, alloc_->allocator()); |
190 | 0 | return EasyJson(&(*value_)[value_->Size() - 1], alloc_); |
191 | 0 | } |
192 | | template <> |
193 | 1 | EasyJson EasyJson::PushBack(EasyJson::ComplexTypeInitializer val) { |
194 | 1 | if (!value_->IsArray()) { |
195 | 0 | value_->SetArray(); |
196 | 0 | } |
197 | 1 | Value push_val; |
198 | 1 | if (val == kObject) { |
199 | 1 | push_val.SetObject(); |
200 | 1 | } else if (val == kArray) { |
201 | 0 | push_val.SetArray(); |
202 | 0 | } else { |
203 | 0 | LOG(FATAL) << "Unknown initializer type"; |
204 | 0 | __builtin_unreachable(); |
205 | 0 | } |
206 | 1 | value_->PushBack(push_val, alloc_->allocator()); |
207 | 1 | return EasyJson(&(*value_)[value_->Size() - 1], alloc_); |
208 | 1 | } |
209 | | |
210 | 0 | string EasyJson::ToString() const { |
211 | 0 | rapidjson::StringBuffer buffer; |
212 | 0 | rapidjson::Writer<rapidjson::StringBuffer> writer(buffer); |
213 | 0 | value_->Accept(writer); |
214 | 0 | return buffer.GetString(); |
215 | 0 | } |
216 | | |
217 | | EasyJson::EasyJson(Value* value, scoped_refptr<EasyJsonAllocator> alloc) |
218 | 20 | : alloc_(std::move(alloc)), value_(value) {} |
219 | | |
220 | | } // namespace doris |