1 #ifndef LLVM_CLANG_TOOLS_EXTRA_TEST_CLANG_TIDY_CHECKERS_BUGPRONE_INPUTS_UNCHECKED_OPTIONAL_ACCESS_FOLLY_TYPES_OPTIONAL_H_
2 #define LLVM_CLANG_TOOLS_EXTRA_TEST_CLANG_TIDY_CHECKERS_BUGPRONE_INPUTS_UNCHECKED_OPTIONAL_ACCESS_FOLLY_TYPES_OPTIONAL_H_
3 
4 /// Mock of `folly::Optional`.
5 namespace folly {
6 
7 struct None {
NoneNone8   constexpr explicit None() {}
9 };
10 
11 constexpr None none;
12 
13 template <typename T>
14 class Optional {
15 public:
16   constexpr Optional() noexcept;
17 
18   constexpr Optional(None) noexcept;
19 
20   Optional(const Optional &) = default;
21 
22   Optional(Optional &&) = default;
23 
24   const T &operator*() const &;
25   T &operator*() &;
26   const T &&operator*() const &&;
27   T &&operator*() &&;
28 
29   const T *operator->() const;
30   T *operator->();
31 
32   const T &value() const &;
33   T &value() &;
34   const T &&value() const &&;
35   T &&value() &&;
36 
37   constexpr explicit operator bool() const noexcept;
38   constexpr bool has_value() const noexcept;
39   constexpr bool hasValue() const noexcept;
40 
41   template <typename U>
42   constexpr T value_or(U &&v) const &;
43   template <typename U>
44   T value_or(U &&v) &&;
45 
46   template <typename... Args>
47   T &emplace(Args &&...args);
48 
49   void reset() noexcept;
50 
51   void swap(Optional &rhs) noexcept;
52 };
53 
54 } // namespace folly
55 
56 #endif // LLVM_CLANG_TOOLS_EXTRA_TEST_CLANG_TIDY_CHECKERS_BUGPRONE_INPUTS_UNCHECKED_OPTIONAL_ACCESS_FOLLY_TYPES_OPTIONAL_H_
57