proxygen
Base.h
Go to the documentation of this file.
1 /*
2  * Copyright 2014-present Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 #define FOLLY_GEN_BASE_H_
19 
20 #include <algorithm>
21 #include <functional>
22 #include <memory>
23 #include <random>
24 #include <type_traits>
25 #include <unordered_map>
26 #include <unordered_set>
27 #include <utility>
28 #include <vector>
29 
30 #include <folly/Conv.h>
31 #include <folly/Optional.h>
32 #include <folly/Range.h>
33 #include <folly/Utility.h>
34 #include <folly/gen/Core.h>
35 
83 namespace folly {
84 namespace gen {
85 
86 class Less {
87  public:
88  template <class First, class Second>
89  auto operator()(const First& first, const Second& second) const
90  -> decltype(first < second) {
91  return first < second;
92  }
93 };
94 
95 class Greater {
96  public:
97  template <class First, class Second>
98  auto operator()(const First& first, const Second& second) const
99  -> decltype(first > second) {
100  return first > second;
101  }
102 };
103 
104 template <int n>
105 class Get {
106  public:
107  template <class Value>
109  -> decltype(std::get<n>(std::forward<Value>(value))) {
110  return std::get<n>(std::forward<Value>(value));
111  }
112 };
113 
114 template <class Class, class Result>
116  public:
117  typedef Result (Class::*MemberPtr)();
118 
119  private:
120  MemberPtr member_;
121 
122  public:
123  explicit MemberFunction(MemberPtr member) : member_(member) {}
124 
125  Result operator()(Class&& x) const {
126  return (x.*member_)();
127  }
128 
129  Result operator()(Class& x) const {
130  return (x.*member_)();
131  }
132 
133  Result operator()(Class* x) const {
134  return (x->*member_)();
135  }
136 };
137 
138 template <class Class, class Result>
140  public:
141  typedef Result (Class::*MemberPtr)() const;
142 
143  private:
144  MemberPtr member_;
145 
146  public:
147  explicit ConstMemberFunction(MemberPtr member) : member_(member) {}
148 
149  Result operator()(const Class& x) const {
150  return (x.*member_)();
151  }
152 
153  Result operator()(const Class* x) const {
154  return (x->*member_)();
155  }
156 };
157 
158 template <class Class, class FieldType>
159 class Field {
160  public:
161  typedef FieldType(Class::*FieldPtr);
162 
163  private:
165 
166  public:
167  explicit Field(FieldPtr field) : field_(field) {}
168 
169  const FieldType& operator()(const Class& x) const {
170  return x.*field_;
171  }
172 
173  const FieldType& operator()(const Class* x) const {
174  return x->*field_;
175  }
176 
177  FieldType& operator()(Class& x) const {
178  return x.*field_;
179  }
180 
181  FieldType& operator()(Class* x) const {
182  return x->*field_;
183  }
184 
185  FieldType&& operator()(Class&& x) const {
186  return std::move(x.*field_);
187  }
188 };
189 
190 class Move {
191  public:
192  template <class Value>
194  -> decltype(std::move(std::forward<Value>(value))) {
195  return std::move(std::forward<Value>(value));
196  }
197 };
198 
202 template <class Predicate>
203 class Negate {
204  Predicate pred_;
205 
206  public:
207  Negate() = default;
208 
209  explicit Negate(Predicate pred) : pred_(std::move(pred)) {}
210 
211  template <class Arg>
212  bool operator()(Arg&& arg) const {
213  return !pred_(std::forward<Arg>(arg));
214  }
215 };
216 template <class Predicate>
217 Negate<Predicate> negate(Predicate pred) {
218  return Negate<Predicate>(std::move(pred));
219 }
220 
221 template <class Dest>
222 class Cast {
223  public:
224  template <class Value>
225  Dest operator()(Value&& value) const {
226  return Dest(std::forward<Value>(value));
227  }
228 };
229 
230 template <class Dest>
231 class To {
232  public:
233  template <class Value>
234  Dest operator()(Value&& value) const {
235  return ::folly::to<Dest>(std::forward<Value>(value));
236  }
237 };
238 
239 template <class Dest>
240 class TryTo {
241  public:
242  template <class Value>
244  return ::folly::tryTo<Dest>(std::forward<Value>(value));
245  }
246 };
247 
248 // Specialization to allow String->StringPiece conversion
249 template <>
250 class To<StringPiece> {
251  public:
253  return src;
254  }
255 };
256 
257 template <class Key, class Value>
258 class Group;
259 
260 namespace detail {
261 
262 template <class Self>
263 struct FBounded;
264 
265 /*
266  * Type Traits
267  */
268 template <class Container>
270  public:
271  using RefType = decltype(*std::begin(std::declval<Container&>()));
273 };
274 
275 /*
276  * Sources
277  */
278 template <
279  class Container,
281 class ReferencedSource;
282 
283 template <
284  class Value,
286 class CopiedSource;
287 
288 template <class Value, class SequenceImpl>
289 class Sequence;
290 
291 template <class Value>
292 class RangeImpl;
293 
294 template <class Value, class Distance>
295 class RangeWithStepImpl;
296 
297 template <class Value>
298 class SeqImpl;
299 
300 template <class Value, class Distance>
301 class SeqWithStepImpl;
302 
303 template <class Value>
304 class InfiniteImpl;
305 
306 template <class Value, class Source>
307 class Yield;
308 
309 template <class Value>
310 class Empty;
311 
312 template <class Value>
313 class SingleReference;
314 
315 template <class Value>
316 class SingleCopy;
317 
318 /*
319  * Operators
320  */
321 template <class Predicate>
322 class Map;
323 
324 template <class Predicate>
325 class Filter;
326 
327 template <class Predicate>
328 class Until;
329 
330 class Take;
331 
332 class Stride;
333 
334 template <class Rand>
335 class Sample;
336 
337 class Skip;
338 
339 template <class Visitor>
340 class Visit;
341 
342 template <class Selector, class Comparer = Less>
343 class Order;
344 
345 template <class Selector>
346 class GroupBy;
347 
348 template <class Selector>
349 class GroupByAdjacent;
350 
351 template <class Selector>
352 class Distinct;
353 
354 template <class Operators>
355 class Composer;
356 
357 template <class Expected>
358 class TypeAssertion;
359 
360 class Concat;
361 
362 class RangeConcat;
363 
364 template <bool forever>
365 class Cycle;
366 
367 class Batch;
368 
369 class Window;
370 
371 class Dereference;
372 
373 class Indirect;
374 
375 /*
376  * Sinks
377  */
378 template <class Seed, class Fold>
379 class FoldLeft;
380 
381 class First;
382 
383 template <bool result>
384 class IsEmpty;
385 
386 template <class Reducer>
387 class Reduce;
388 
389 class Sum;
390 
391 template <class Selector, class Comparer>
392 class Min;
393 
394 template <class Container>
395 class Collect;
396 
397 template <
398  template <class, class> class Collection = std::vector,
399  template <class> class Allocator = std::allocator>
400 class CollectTemplate;
401 
402 template <class Collection>
403 class Append;
404 
405 template <class Value>
406 struct GeneratorBuilder;
407 
408 template <class Needle>
409 class Contains;
410 
411 template <class Exception, class ErrorHandler>
412 class GuardImpl;
413 
414 template <class T>
415 class UnwrapOr;
416 
417 class Unwrap;
418 
419 } // namespace detail
420 
424 template <class Value>
425 class VirtualGen;
426 
427 /*
428  * Source Factories
429  */
430 template <
431  class Container,
433 From fromConst(const Container& source) {
434  return From(&source);
435 }
436 
437 template <class Container, class From = detail::ReferencedSource<Container>>
438 From from(Container& source) {
439  return From(&source);
440 }
441 
442 template <
443  class Container,
445  class CopyOf = detail::CopiedSource<Value>>
446 CopyOf fromCopy(Container&& source) {
447  return CopyOf(std::forward<Container>(source));
448 }
449 
450 template <class Value, class From = detail::CopiedSource<Value>>
451 From from(std::initializer_list<Value> source) {
452  return From(source);
453 }
454 
455 template <
456  class Container,
457  class From =
459 From from(Container&& source) {
460  return From(std::move(source));
461 }
462 
463 template <
464  class Value,
465  class Impl = detail::RangeImpl<Value>,
466  class Gen = detail::Sequence<Value, Impl>>
467 Gen range(Value begin, Value end) {
468  return Gen{std::move(begin), Impl{std::move(end)}};
469 }
470 
471 template <
472  class Value,
473  class Distance,
475  class Gen = detail::Sequence<Value, Impl>>
476 Gen range(Value begin, Value end, Distance step) {
477  return Gen{std::move(begin), Impl{std::move(end), std::move(step)}};
478 }
479 
480 template <
481  class Value,
482  class Impl = detail::SeqImpl<Value>,
483  class Gen = detail::Sequence<Value, Impl>>
484 Gen seq(Value first, Value last) {
485  return Gen{std::move(first), Impl{std::move(last)}};
486 }
487 
488 template <
489  class Value,
490  class Distance,
492  class Gen = detail::Sequence<Value, Impl>>
493 Gen seq(Value first, Value last, Distance step) {
494  return Gen{std::move(first), Impl{std::move(last), std::move(step)}};
495 }
496 
497 template <
498  class Value,
499  class Impl = detail::InfiniteImpl<Value>,
500  class Gen = detail::Sequence<Value, Impl>>
501 Gen seq(Value first) {
502  return Gen{std::move(first), Impl{}};
503 }
504 
505 template <class Value, class Source, class Yield = detail::Yield<Value, Source>>
506 Yield generator(Source&& source) {
507  return Yield(std::forward<Source>(source));
508 }
509 
510 /*
511  * Create inline generator, used like:
512  *
513  * auto gen = GENERATOR(int) { yield(1); yield(2); };
514  */
515 #define GENERATOR(TYPE) \
516  ::folly::gen::detail::GeneratorBuilder<TYPE>() + [=](auto&& yield)
517 
518 /*
519  * empty() - for producing empty sequences.
520  */
521 template <class Value>
523  return {};
524 }
525 
526 template <
527  class Value,
528  class Just = typename std::conditional<
532 Just just(Value&& value) {
533  return Just(std::forward<Value>(value));
534 }
535 
536 /*
537  * Operator Factories
538  */
539 template <class Predicate, class Map = detail::Map<Predicate>>
540 Map mapped(Predicate pred = Predicate()) {
541  return Map(std::move(pred));
542 }
543 
544 template <class Predicate, class Map = detail::Map<Predicate>>
545 Map map(Predicate pred = Predicate()) {
546  return Map(std::move(pred));
547 }
548 
558 template <class Operator, class Map = detail::Map<detail::Composer<Operator>>>
561 }
562 
563 /*
564  * member(...) - For extracting a member from each value.
565  *
566  * vector<string> strings = ...;
567  * auto sizes = from(strings) | member(&string::size);
568  *
569  * If a member is const overridden (like 'front()'), pass template parameter
570  * 'Const' to select the const version, or 'Mutable' to select the non-const
571  * version:
572  *
573  * auto heads = from(strings) | member<Const>(&string::front);
574  */
578 };
579 
585 template <MemberType Constness>
586 struct ExprIsConst {
587  enum {
588  value = Constness == Const,
589  };
590 };
591 
592 template <MemberType Constness>
594  enum {
595  value = Constness == Mutable,
596  };
597 };
598 
599 template <
600  MemberType Constness = Const,
601  class Class,
602  class Return,
604  class Map = detail::Map<Mem>>
606  Return (Class::*member)() const) {
607  return Map(Mem(member));
608 }
609 
610 template <
611  MemberType Constness = Mutable,
612  class Class,
613  class Return,
614  class Mem = MemberFunction<Class, Return>,
615  class Map = detail::Map<Mem>>
617  Return (Class::*member)()) {
618  return Map(Mem(member));
619 }
620 
621 /*
622  * field(...) - For extracting a field from each value.
623  *
624  * vector<Item> items = ...;
625  * auto names = from(items) | field(&Item::name);
626  *
627  * Note that if the values of the generator are rvalues, any non-reference
628  * fields will be rvalues as well. As an example, the code below does not copy
629  * any strings, only moves them:
630  *
631  * auto namesVector = from(items)
632  * | move
633  * | field(&Item::name)
634  * | as<vector>();
635  */
636 template <
637  class Class,
638  class FieldType,
640  class Map = detail::Map<Field>>
641 Map field(FieldType Class::*field) {
642  return Map(Field(field));
643 }
644 
645 template <class Predicate = Identity, class Filter = detail::Filter<Predicate>>
646 Filter filter(Predicate pred = Predicate()) {
647  return Filter(std::move(pred));
648 }
649 
650 template <class Visitor = Ignore, class Visit = detail::Visit<Visitor>>
651 Visit visit(Visitor visitor = Visitor()) {
652  return Visit(std::move(visitor));
653 }
654 
655 template <class Predicate = Identity, class Until = detail::Until<Predicate>>
656 Until until(Predicate pred = Predicate()) {
657  return Until(std::move(pred));
658 }
659 
660 template <
661  class Predicate = Identity,
662  class TakeWhile = detail::Until<Negate<Predicate>>>
663 TakeWhile takeWhile(Predicate pred = Predicate()) {
664  return TakeWhile(Negate<Predicate>(std::move(pred)));
665 }
666 
667 template <
668  class Selector = Identity,
669  class Comparer = Less,
670  class Order = detail::Order<Selector, Comparer>>
671 Order orderBy(Selector selector = Selector(), Comparer comparer = Comparer()) {
672  return Order(std::move(selector), std::move(comparer));
673 }
674 
675 template <
676  class Selector = Identity,
677  class Order = detail::Order<Selector, Greater>>
678 Order orderByDescending(Selector selector = Selector()) {
679  return Order(std::move(selector));
680 }
681 
682 template <class Selector = Identity, class GroupBy = detail::GroupBy<Selector>>
683 GroupBy groupBy(Selector selector = Selector()) {
684  return GroupBy(std::move(selector));
685 }
686 
687 template <
688  class Selector = Identity,
689  class GroupByAdjacent = detail::GroupByAdjacent<Selector>>
690 GroupByAdjacent groupByAdjacent(Selector selector = Selector()) {
691  return GroupByAdjacent(std::move(selector));
692 }
693 
694 template <
695  class Selector = Identity,
696  class Distinct = detail::Distinct<Selector>>
697 Distinct distinctBy(Selector selector = Selector()) {
698  return Distinct(std::move(selector));
699 }
700 
701 template <int n, class Get = detail::Map<Get<n>>>
702 Get get() {
703  return Get();
704 }
705 
706 // construct Dest from each value
707 template <class Dest, class Cast = detail::Map<Cast<Dest>>>
709  return Cast();
710 }
711 
712 // call folly::to on each value
713 template <class Dest, class EachTo = detail::Map<To<Dest>>>
714 EachTo eachTo() {
715  return EachTo();
716 }
717 
718 // call folly::tryTo on each value
719 template <class Dest, class EachTryTo = detail::Map<TryTo<Dest>>>
720 EachTryTo eachTryTo() {
721  return EachTryTo();
722 }
723 
724 template <class Value>
726  return {};
727 }
728 
729 /*
730  * Sink Factories
731  */
732 
753 template <
754  class Predicate = Identity,
755  class Filter = detail::Filter<Predicate>,
756  class NotEmpty = detail::IsEmpty<false>,
757  class Composed = detail::Composed<Filter, NotEmpty>>
758 Composed any(Predicate pred = Predicate()) {
759  return Composed(Filter(std::move(pred)), NotEmpty());
760 }
761 
781 template <
782  class Predicate = Identity,
783  class Filter = detail::Filter<Negate<Predicate>>,
784  class IsEmpty = detail::IsEmpty<true>,
785  class Composed = detail::Composed<Filter, IsEmpty>>
786 Composed all(Predicate pred = Predicate()) {
787  return Composed(Filter(std::move(negate(pred))), IsEmpty());
788 }
789 
790 template <class Seed, class Fold, class FoldLeft = detail::FoldLeft<Seed, Fold>>
791 FoldLeft foldl(Seed seed = Seed(), Fold fold = Fold()) {
792  return FoldLeft(std::move(seed), std::move(fold));
793 }
794 
795 template <class Reducer, class Reduce = detail::Reduce<Reducer>>
796 Reduce reduce(Reducer reducer = Reducer()) {
797  return Reduce(std::move(reducer));
798 }
799 
800 template <class Selector = Identity, class Min = detail::Min<Selector, Less>>
801 Min minBy(Selector selector = Selector()) {
802  return Min(std::move(selector));
803 }
804 
805 template <class Selector, class MaxBy = detail::Min<Selector, Greater>>
806 MaxBy maxBy(Selector selector = Selector()) {
807  return MaxBy(std::move(selector));
808 }
809 
810 template <class Collection, class Collect = detail::Collect<Collection>>
811 Collect as() {
812  return Collect();
813 }
814 
815 template <
816  template <class, class> class Container = std::vector,
817  template <class> class Allocator = std::allocator,
819 Collect as() {
820  return Collect();
821 }
822 
823 template <class Collection, class Append = detail::Append<Collection>>
824 Append appendTo(Collection& collection) {
825  return Append(&collection);
826 }
827 
828 template <
829  class Needle,
831 Contains contains(Needle&& needle) {
832  return Contains(std::forward<Needle>(needle));
833 }
834 
835 template <
836  class Exception,
837  class ErrorHandler,
838  class GuardImpl =
840 GuardImpl guard(ErrorHandler&& handler) {
841  return GuardImpl(std::forward<ErrorHandler>(handler));
842 }
843 
844 template <
845  class Fallback,
847 UnwrapOr unwrapOr(Fallback&& fallback) {
848  return UnwrapOr(std::forward<Fallback>(fallback));
849 }
850 
851 } // namespace gen
852 } // namespace folly
853 
854 #include <folly/gen/Base-inl.h>
Result operator()(Class &&x) const
Definition: Base.h:125
const string needle
Definition: InvokeTest.cpp:58
decltype(*std::begin(std::declval< Container & >())) RefType
Definition: Base.h:271
Yield generator(Source &&source)
Definition: Base.h:506
Result operator()(const Class *x) const
Definition: Base.h:153
CopyOf fromCopy(Container &&source)
Definition: Base.h:446
FieldTypeClass::* FieldPtr
Definition: Base.h:161
Expected< Dest, ConversionCode > operator()(Value &&value) const
Definition: Base.h:243
Negate< Predicate > negate(Predicate pred)
Definition: Base.h:217
Result operator()(Class *x) const
Definition: Base.h:133
MemberType
Definition: Base.h:575
Map field(FieldType Class::*field)
Definition: Base.h:641
EachTryTo eachTryTo()
Definition: Base.h:720
From from(Container &source)
Definition: Base.h:438
PskType type
static const int seed
StringPiece operator()(StringPiece src) const
Definition: Base.h:252
Get get()
Definition: Base.h:702
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
STL namespace.
auto begin(TestAdlIterable &instance)
Definition: ForeachTest.cpp:56
Reduce reduce(Reducer reducer=Reducer())
Definition: Base.h:796
Gen seq(Value first, Value last)
Definition: Base.h:484
typename std::decay< RefType >::type StorageType
Definition: Base.h:272
Visit visit(Visitor visitor=Visitor())
Definition: Base.h:651
bool operator()(Arg &&arg) const
Definition: Base.h:212
—— Concurrent Priority Queue Implementation ——
Definition: AtomicBitSet.h:29
EachTo eachTo()
Definition: Base.h:714
FieldPtr field_
Definition: Base.h:164
Min minBy(Selector selector=Selector())
Definition: Base.h:801
std::unordered_map< int64_t, VecT > Map
auto operator()(Value &&value) const -> decltype(std::move(std::forward< Value >(value)))
Definition: Base.h:193
FieldType & operator()(Class *x) const
Definition: Base.h:181
Dest operator()(Value &&value) const
Definition: Base.h:234
Composed any(Predicate pred=Predicate())
Definition: Base.h:758
FieldType & operator()(Class &x) const
Definition: Base.h:177
void handler(int, siginfo_t *, void *)
Map mapOp(Operator op)
Definition: Base.h:559
Gen range(Value begin, Value end)
Definition: Base.h:467
Negate(Predicate pred)
Definition: Base.h:209
ConstMemberFunction(MemberPtr member)
Definition: Base.h:147
FoldLeft foldl(Seed seed=Seed(), Fold fold=Fold())
Definition: Base.h:791
GroupByAdjacent groupByAdjacent(Selector selector=Selector())
Definition: Base.h:690
const FieldType & operator()(const Class &x) const
Definition: Base.h:169
Order orderByDescending(Selector selector=Selector())
Definition: Base.h:678
auto operator()(const First &first, const Second &second) const -> decltype(first< second)
Definition: Base.h:89
auto operator()(Value &&value) const -> decltype(std::get< n >(std::forward< Value >(value)))
Definition: Base.h:108
UnwrapOr unwrapOr(Fallback &&fallback)
Definition: Base.h:847
bool Value(const T &value, M matcher)
Order orderBy(Selector selector=Selector(), Comparer comparer=Comparer())
Definition: Base.h:671
Field(FieldPtr field)
Definition: Base.h:167
Contains contains(Needle &&needle)
Definition: Base.h:831
From fromConst(const Container &source)
Definition: Base.h:433
auto end(TestAdlIterable &instance)
Definition: ForeachTest.cpp:62
Dest operator()(Value &&value) const
Definition: Base.h:225
GuardImpl guard(ErrorHandler &&handler)
Definition: Base.h:840
Map map(Predicate pred=Predicate())
Definition: Base.h:545
Result operator()(const Class &x) const
Definition: Base.h:149
Just just(Value &&value)
Definition: Base.h:532
Result operator()(Class &x) const
Definition: Base.h:129
TakeWhile takeWhile(Predicate pred=Predicate())
Definition: Base.h:663
PolymorphicMatcher< internal::FieldMatcher< Class, FieldType > > Field(FieldType Class::*field, const FieldMatcher &matcher)
Predicate pred_
Definition: Base.h:204
Append appendTo(Collection &collection)
Definition: Base.h:824
static const char *const value
Definition: Conv.cpp:50
Filter filter(Predicate pred=Predicate())
Definition: Base.h:646
std::enable_if< ExprIsConst< Constness >::value, Map >::type member(Return(Class::*member)() const)
Definition: Base.h:605
Distinct distinctBy(Selector selector=Selector())
Definition: Base.h:697
MaxBy maxBy(Selector selector=Selector())
Definition: Base.h:806
Until until(Predicate pred=Predicate())
Definition: Base.h:656
detail::Empty< Value > empty()
Definition: Base.h:522
FOLLY_ALWAYS_INLINE FOLLY_ATTR_VISIBILITY_HIDDEN auto fold(Fn &&, A &&a)
const
Definition: upload.py:398
uint64_t value(const typename LockFreeRingBuffer< T, Atom >::Cursor &rbcursor)
Map mapped(Predicate pred=Predicate())
Definition: Base.h:540
FieldType && operator()(Class &&x) const
Definition: Base.h:185
auto operator()(const First &first, const Second &second) const -> decltype(first > second)
Definition: Base.h:98
internal::ContainsMatcher< M > Contains(M matcher)
Cast eachAs()
Definition: Base.h:708
Collect as()
Definition: Base.h:811
const FieldType & operator()(const Class *x) const
Definition: Base.h:173
detail::TypeAssertion< Value > assert_type()
Definition: Base.h:725
GroupBy groupBy(Selector selector=Selector())
Definition: Base.h:683
internal::ReturnAction< R > Return(R value)
MemberFunction(MemberPtr member)
Definition: Base.h:123
constexpr detail::First first
Definition: Base-inl.h:2553
Composed all(Predicate pred=Predicate())
Definition: Base.h:786