Skip to content

Commit d69b8dd

Browse files
Alfred Fullerfacebook-github-bot
authored andcommitted
Minor detail cleanup
Summary: In prep for supporting 'assign' for UnionPatch Reviewed By: iahs Differential Revision: D39125277 fbshipit-source-id: 57164eb696e8c5b827d95c20a15cc929c6f42cb5
1 parent 0a0dbf4 commit d69b8dd

File tree

4 files changed

+133
-127
lines changed

4 files changed

+133
-127
lines changed

third-party/thrift/src/thrift/lib/cpp2/op/detail/BasePatch.h

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -147,12 +147,12 @@ class BasePatch : public type::detail::EqWrap<Derived, Patch> {
147147
~BasePatch() = default; // abstract base class
148148
};
149149

150-
// Base class for value patch types.
150+
// Base class for assign patch types.
151151
//
152152
// Patch must have the following fields:
153-
// optional T assign;
153+
// [optional] T assign;
154154
template <typename Patch, typename Derived>
155-
class BaseValuePatch : public BasePatch<Patch, Derived> {
155+
class BaseAssignPatch : public BasePatch<Patch, Derived> {
156156
using Base = BasePatch<Patch, Derived>;
157157

158158
public:
@@ -198,8 +198,7 @@ class BaseValuePatch : public BasePatch<Patch, Derived> {
198198
using Base::data_;
199199
using Base::derived;
200200
using Base::resetAnd;
201-
202-
~BaseValuePatch() = default; // abstract base class
201+
~BaseAssignPatch() = default; // abstract base class
203202

204203
FOLLY_NODISCARD value_type& assignOr(value_type& value) noexcept {
205204
return hasValue(data_.assign()) ? *data_.assign() : value;
@@ -227,14 +226,14 @@ class BaseValuePatch : public BasePatch<Patch, Derived> {
227226
}
228227
};
229228

230-
// Base class for clearable value patch types.
229+
// Base class for clearable patch types.
231230
//
232231
// Patch must have the following fields:
233-
// optional T assign;
232+
// (optional) T assign;
234233
// bool clear;
235234
template <typename Patch, typename Derived>
236-
class BaseClearValuePatch : public BaseValuePatch<Patch, Derived> {
237-
using Base = BaseValuePatch<Patch, Derived>;
235+
class BaseClearPatch : public BaseAssignPatch<Patch, Derived> {
236+
using Base = BaseAssignPatch<Patch, Derived>;
238237
using T = typename Base::value_type;
239238

240239
public:
@@ -247,15 +246,11 @@ class BaseClearValuePatch : public BaseValuePatch<Patch, Derived> {
247246
return patch;
248247
}
249248

250-
void clear() { resetAnd().clear() = true; }
251-
252249
protected:
253-
using Base::applyAssign;
254250
using Base::data_;
255251
using Base::mergeAssign;
256252
using Base::resetAnd;
257-
258-
~BaseClearValuePatch() = default;
253+
~BaseClearPatch() = default;
259254

260255
template <typename U>
261256
bool mergeAssignAndClear(U&& next) {
@@ -270,6 +265,41 @@ class BaseClearValuePatch : public BaseValuePatch<Patch, Derived> {
270265
}
271266
return mergeAssign(std::forward<U>(next));
272267
}
268+
269+
void clear() { resetAnd().clear() = true; }
270+
FOLLY_NODISCARD T& clearAnd() { return (clear(), data_); }
271+
};
272+
273+
// Base class for 'container' patch types.
274+
//
275+
// Patch must have the following fields:
276+
// (optional) T assign;
277+
// bool clear;
278+
template <typename Patch, typename Derived>
279+
class BaseContainerPatch : public BaseClearPatch<Patch, Derived> {
280+
using Base = BaseClearPatch<Patch, Derived>;
281+
using T = typename Base::value_type;
282+
283+
public:
284+
using Base::Base;
285+
using Base::operator=;
286+
using Base::clear;
287+
288+
protected:
289+
using Base::applyAssign;
290+
using Base::data_;
291+
~BaseContainerPatch() = default; // Abstract base class.
292+
293+
// Returns true if assign was applied, and no more patchs should be applied.
294+
bool applyAssignOrClear(T& val) const {
295+
if (applyAssign(val)) {
296+
return true;
297+
}
298+
if (data_.clear() == true) {
299+
val.clear();
300+
}
301+
return false;
302+
}
273303
};
274304

275305
// Patch must have the following fields:

third-party/thrift/src/thrift/lib/cpp2/op/detail/ContainerPatch.h

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ void erase_all(C1& container, const C2& values) {
3939
// list<T> append;
4040
// list<T> prepend;
4141
template <typename Patch>
42-
class ListPatch : public BaseClearValuePatch<Patch, ListPatch<Patch>> {
43-
using Base = BaseClearValuePatch<Patch, ListPatch>;
42+
class ListPatch : public BaseContainerPatch<Patch, ListPatch<Patch>> {
43+
using Base = BaseContainerPatch<Patch, ListPatch>;
4444
using T = typename Base::value_type;
4545

4646
public:
@@ -95,10 +95,7 @@ class ListPatch : public BaseClearValuePatch<Patch, ListPatch<Patch>> {
9595
}
9696

9797
void apply(T& val) const {
98-
if (!applyAssign(val)) {
99-
if (data_.clear() == true) {
100-
val.clear();
101-
}
98+
if (!applyAssignOrClear(val)) {
10299
val.insert(val.begin(), data_.prepend()->begin(), data_.prepend()->end());
103100
val.insert(val.end(), data_.append()->begin(), data_.append()->end());
104101
}
@@ -123,7 +120,7 @@ class ListPatch : public BaseClearValuePatch<Patch, ListPatch<Patch>> {
123120
}
124121

125122
private:
126-
using Base::applyAssign;
123+
using Base::applyAssignOrClear;
127124
using Base::assignOr;
128125
using Base::data_;
129126
using Base::mergeAssignAndClear;
@@ -135,8 +132,8 @@ class ListPatch : public BaseClearValuePatch<Patch, ListPatch<Patch>> {
135132
// set<T> add;
136133
// set<T> remove;
137134
template <typename Patch>
138-
class SetPatch : public BaseClearValuePatch<Patch, SetPatch<Patch>> {
139-
using Base = BaseClearValuePatch<Patch, SetPatch>;
135+
class SetPatch : public BaseContainerPatch<Patch, SetPatch<Patch>> {
136+
using Base = BaseContainerPatch<Patch, SetPatch>;
140137
using T = typename Base::value_type;
141138

142139
public:
@@ -200,14 +197,12 @@ class SetPatch : public BaseClearValuePatch<Patch, SetPatch<Patch>> {
200197
}
201198

202199
void apply(T& val) const {
203-
if (!applyAssign(val)) {
204-
if (data_.clear() == true) {
205-
val.clear();
206-
} else {
207-
erase_all(val, *data_.remove());
208-
}
209-
val.insert(data_.add()->begin(), data_.add()->end());
200+
if (applyAssignOrClear(val)) {
201+
return;
210202
}
203+
204+
erase_all(val, *data_.remove());
205+
val.insert(data_.add()->begin(), data_.add()->end());
211206
}
212207

213208
template <typename U>
@@ -219,7 +214,7 @@ class SetPatch : public BaseClearValuePatch<Patch, SetPatch<Patch>> {
219214
}
220215

221216
private:
222-
using Base::applyAssign;
217+
using Base::applyAssignOrClear;
223218
using Base::assignOr;
224219
using Base::data_;
225220
using Base::mergeAssignAndClear;
@@ -230,8 +225,8 @@ class SetPatch : public BaseClearValuePatch<Patch, SetPatch<Patch>> {
230225
// bool clear;
231226
// map<K, V> put;
232227
template <typename Patch>
233-
class MapPatch : public BaseClearValuePatch<Patch, MapPatch<Patch>> {
234-
using Base = BaseClearValuePatch<Patch, MapPatch>;
228+
class MapPatch : public BaseContainerPatch<Patch, MapPatch<Patch>> {
229+
using Base = BaseContainerPatch<Patch, MapPatch>;
235230
using T = typename Base::value_type;
236231

237232
public:
@@ -262,13 +257,11 @@ class MapPatch : public BaseClearValuePatch<Patch, MapPatch<Patch>> {
262257
}
263258

264259
void apply(T& val) const {
265-
if (!applyAssign(val)) {
266-
if (data_.clear() == true) {
267-
val.clear();
268-
}
269-
for (const auto& entry : *data_.put()) {
270-
val.insert_or_assign(entry.first, entry.second);
271-
}
260+
if (applyAssignOrClear(val)) {
261+
return;
262+
}
263+
for (const auto& entry : *data_.put()) {
264+
val.insert_or_assign(entry.first, entry.second);
272265
}
273266
}
274267

@@ -280,7 +273,7 @@ class MapPatch : public BaseClearValuePatch<Patch, MapPatch<Patch>> {
280273
}
281274

282275
private:
283-
using Base::applyAssign;
276+
using Base::applyAssignOrClear;
284277
using Base::assignOr;
285278
using Base::data_;
286279
using Base::mergeAssignAndClear;

third-party/thrift/src/thrift/lib/cpp2/op/detail/StructPatch.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,13 @@ class FieldPatch : public BasePatch<Patch, FieldPatch<Patch>> {
5454

5555
template <typename T>
5656
void apply(T& val) const {
57-
op::for_each_field_id<Patch>(
58-
[&](auto id) { get(id)->apply(get(id, val)); });
57+
for_each_field_id<Patch>([&](auto id) { get(id)->apply(get(id, val)); });
5958
}
6059

6160
template <typename U>
6261
void merge(U&& next) {
6362
auto&& tval = std::forward<U>(next).toThrift();
64-
op::for_each_field_id<Patch>([&](auto id) {
63+
for_each_field_id<Patch>([&](auto id) {
6564
get(id)->merge(*get(id, std::forward<decltype(tval)>(tval)));
6665
});
6766
}
@@ -89,8 +88,8 @@ class FieldPatch : public BasePatch<Patch, FieldPatch<Patch>> {
8988
// P patchPrior;
9089
// P patch;
9190
template <typename Patch>
92-
class StructPatch : public BaseClearValuePatch<Patch, StructPatch<Patch>> {
93-
using Base = BaseClearValuePatch<Patch, StructPatch>;
91+
class StructPatch : public BaseClearPatch<Patch, StructPatch<Patch>> {
92+
using Base = BaseClearPatch<Patch, StructPatch>;
9493
using T = typename Base::value_type;
9594

9695
public:
@@ -137,7 +136,7 @@ class StructPatch : public BaseClearValuePatch<Patch, StructPatch<Patch>> {
137136
*data_.clear() = true;
138137

139138
// Split the assignment patch into a patch of assignments.
140-
op::for_each_field_id<T>([&](auto id) {
139+
for_each_field_id<T>([&](auto id) {
141140
data_.patch()->get(id)->assign(get(id, std::move(*data_.assign())));
142141
});
143142
// Unset assign.

0 commit comments

Comments
 (0)