Coverage Report

Created: 2024-11-20 12:30

/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