Skip to content

Commit 903df59

Browse files
committed
get things to compile
1 parent d925a22 commit 903df59

File tree

5 files changed

+28
-28
lines changed

5 files changed

+28
-28
lines changed

Firestore/core/src/core/filter.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#ifndef FIRESTORE_CORE_SRC_CORE_FILTER_H_
1818
#define FIRESTORE_CORE_SRC_CORE_FILTER_H_
1919

20+
#include <functional>
2021
#include <iosfwd>
2122
#include <memory>
2223
#include <string>
@@ -146,7 +147,8 @@ class Filter {
146147
virtual bool IsEmpty() const = 0;
147148

148149
virtual const std::vector<FieldFilter>& GetFlattenedFilters() const {
149-
return flattened_filters_.value();
150+
const auto func = std::bind(&Rep::CalculateFlattenedFilters, this);
151+
return memoized_flattened_filters_.value(func);
150152
}
151153

152154
virtual std::vector<Filter> GetFilters() const = 0;
@@ -159,7 +161,7 @@ class Filter {
159161
* Memoized list of all field filters that can be found by
160162
* traversing the tree of filters contained in this composite filter.
161163
*/
162-
mutable util::ThreadSafeMemoizer<std::vector<FieldFilter>> flattened_filters_{[&] { return CalculateFlattenedFilters(); }};
164+
mutable util::ThreadSafeMemoizer<std::vector<FieldFilter>> memoized_flattened_filters_;
163165
};
164166

165167
explicit Filter(std::shared_ptr<const Rep>&& rep) : rep_(rep) {

Firestore/core/src/core/query.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "Firestore/core/src/core/query.h"
1818

1919
#include <algorithm>
20+
#include <memory>
2021
#include <ostream>
2122

2223
#include "Firestore/core/src/core/bound.h"
@@ -92,7 +93,7 @@ absl::optional<Operator> Query::FindOpInsideFilters(
9293
return absl::nullopt;
9394
}
9495

95-
std::shared_ptr<std::vector<OrderBy>> Query::calculate_normalized_order_bys() const {
96+
std::shared_ptr<std::vector<OrderBy>> Query::CalculateNormalizedOrderBys() const {
9697
auto result = std::make_shared<std::vector<OrderBy>>(explicit_order_bys_);
9798

9899
std::set<FieldPath> fieldsNormalized;
@@ -295,11 +296,11 @@ std::string Query::ToString() const {
295296
return absl::StrCat("Query(canonical_id=", CanonicalId(), ")");
296297
}
297298

298-
std::shared_ptr<Target> Query::calculate_target() const {
299+
std::shared_ptr<Target> Query::CalculateTarget() const {
299300
return std::make_shared<Target>(ToTarget(normalized_order_bys()));
300301
}
301302

302-
std::shared_ptr<Target> Query::calculate_aggregate_target() const {
303+
std::shared_ptr<Target> Query::CalculateAggregateTarget() const {
303304
return std::make_shared<Target>(ToTarget(explicit_order_bys_));
304305
}
305306

Firestore/core/src/core/query.h

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ class Query {
149149
* backend behavior.
150150
*/
151151
const std::vector<OrderBy>& normalized_order_bys() const {
152-
return normalized_order_bys_.value();
152+
const auto func = std::bind(&Query::CalculateNormalizedOrderBys, this);
153+
return memoized_normalized_order_bys_.value(func);
153154
}
154155

155156
bool has_limit() const {
@@ -249,7 +250,8 @@ class Query {
249250
* and local store.
250251
*/
251252
const Target& ToTarget() const& {
252-
return target_.value();
253+
const auto func = std::bind(&Query::CalculateTarget, this);
254+
return memoized_target_.value(func);
253255
}
254256

255257
/**
@@ -259,7 +261,8 @@ class Query {
259261
* normalized order-bys, they only contain explicit order-bys.
260262
*/
261263
const Target& ToAggregateTarget() const& {
262-
return aggregate_target_.value();
264+
const auto func = std::bind(&Query::CalculateAggregateTarget, this);
265+
return memoized_aggregate_target_.value(func);
263266
}
264267

265268
friend std::ostream& operator<<(std::ostream& os, const Query& query);
@@ -301,19 +304,18 @@ class Query {
301304
// member variable, which is not copyable).
302305

303306
// The memoized list of sort orders.
304-
std::shared_ptr<std::vector<OrderBy>> calculate_normalized_order_bys() const;
305-
mutable util::ThreadSafeMemoizer<std::vector<OrderBy>>
306-
normalized_order_bys_{[&] {return calculate_normalized_order_bys(); }};
307+
std::shared_ptr<std::vector<OrderBy>> CalculateNormalizedOrderBys() const;
308+
mutable util::ThreadSafeMemoizer<std::vector<OrderBy>> memoized_normalized_order_bys_;
307309

308310
// The corresponding Target of this Query instance.
309-
std::shared_ptr<Target> calculate_target() const;
310-
mutable util::ThreadSafeMemoizer<Target> target_{[&] {return calculate_target(); }};
311+
std::shared_ptr<Target> CalculateTarget() const;
312+
mutable util::ThreadSafeMemoizer<Target> memoized_target_;
311313

312314
// The corresponding aggregate Target of this Query instance. Unlike targets
313315
// for non-aggregate queries, aggregate query targets do not contain
314316
// normalized order-bys, they only contain explicit order-bys.
315-
std::shared_ptr<Target> calculate_aggregate_target() const;
316-
mutable util::ThreadSafeMemoizer<Target> aggregate_target_{[&] {return calculate_aggregate_target(); }};;
317+
std::shared_ptr<Target> CalculateAggregateTarget() const;
318+
mutable util::ThreadSafeMemoizer<Target> memoized_aggregate_target_;
317319
};
318320

319321
bool operator==(const Query& lhs, const Query& rhs);

Firestore/core/src/util/thread_safe_memoizer.h

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
#include <atomic>
2121
#include <functional>
2222
#include <memory>
23-
#include <utility>
2423

2524
namespace firebase {
2625
namespace firestore {
@@ -33,22 +32,19 @@ namespace util {
3332
template <typename T>
3433
class ThreadSafeMemoizer {
3534
public:
36-
explicit ThreadSafeMemoizer(std::function<std::shared_ptr<T>()> func) : func_(std::move(func)) {
37-
}
35+
ThreadSafeMemoizer() = default;
3836

39-
ThreadSafeMemoizer(const ThreadSafeMemoizer& other) : func_(other.func_), memoized_(std::atomic_load(&other.memoized_)) {}
37+
ThreadSafeMemoizer(const ThreadSafeMemoizer& other) : memoized_(std::atomic_load(&other.memoized_)) {}
4038

4139
ThreadSafeMemoizer& operator=(const ThreadSafeMemoizer& other) {
42-
func_ = other.func_;
4340
std::atomic_store(&memoized_, std::atomic_load(&other.memoized_));
4441
return *this;
4542
}
4643

47-
ThreadSafeMemoizer(ThreadSafeMemoizer&& other) noexcept : func_(std::move(other.func_)), memoized_(std::atomic_load(&other.memoized_)) {
44+
ThreadSafeMemoizer(ThreadSafeMemoizer&& other) noexcept : memoized_(std::atomic_load(&other.memoized_)) {
4845
}
4946

5047
ThreadSafeMemoizer& operator=(ThreadSafeMemoizer&& other) noexcept {
51-
func_ = std::move(other.func_);
5248
std::atomic_store(&memoized_, std::atomic_load(&other.memoized_));
5349
return *this;
5450
}
@@ -70,14 +66,14 @@ class ThreadSafeMemoizer {
7066
* No reference to the given function is retained by this object, and the
7167
* function be called synchronously, if it is called at all.
7268
*/
73-
const T& value() {
69+
const T& value(const std::function<std::shared_ptr<T>()>& func) {
7470
std::shared_ptr<T> old_memoized = std::atomic_load(&memoized_);
7571
while (true) {
7672
if (old_memoized) {
7773
return *old_memoized;
7874
}
7975

80-
std::shared_ptr<T> new_memoized = func_();
76+
std::shared_ptr<T> new_memoized = func();
8177

8278
if (std::atomic_compare_exchange_weak(&memoized_, &old_memoized, new_memoized)) {
8379
return *new_memoized;
@@ -86,7 +82,6 @@ class ThreadSafeMemoizer {
8682
}
8783

8884
private:
89-
std::function<std::shared_ptr<T>()> func_;
9085
std::shared_ptr<T> memoized_;
9186
};
9287

Firestore/core/test/unit/util/thread_safe_memoizer_test.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ TEST(ThreadSafeMemoizerTest, MultiThreadedMemoization) {
4040
constexpr int expected_result = 78;
4141

4242
// Create a thread safe memoizer and multiple threads.
43-
ThreadSafeMemoizer<int> memoized_result(expensive_lambda);
43+
ThreadSafeMemoizer<int> memoized_result;
4444
std::vector<std::thread> threads;
4545

4646
for (int i = 0; i < num_threads; ++i) {
4747
threads.emplace_back(
48-
[&memoized_result, expected_result] {
49-
const int& actual_result = memoized_result.value();
48+
[&memoized_result, expected_result, &expensive_lambda] {
49+
const int& actual_result = memoized_result.value(expensive_lambda);
5050
// Verify that all threads get the same memoized result.
5151
EXPECT_EQ(actual_result, expected_result);
5252
});

0 commit comments

Comments
 (0)