1 #ifndef STRUCTURES_H 2 #define STRUCTURES_H 3 4 extern "C" { 5 extern int printf(const char *restrict, ...); 6 } 7 8 struct Val {int X; void g(); }; 9 10 struct MutableVal { 11 void constFun(int) const; 12 void nonConstFun(int, int); 13 void constFun(MutableVal &) const; 14 void constParamFun(const MutableVal &) const; 15 void nonConstParamFun(const MutableVal &); 16 int X; 17 }; 18 19 struct NonTriviallyCopyable { 20 NonTriviallyCopyable() = default; 21 // Define this constructor to make this class non-trivially copyable. 22 NonTriviallyCopyable(const NonTriviallyCopyable& Ntc); 23 int X; 24 }; 25 26 struct TriviallyCopyableButBig { 27 int X; 28 char Array[16]; 29 }; 30 31 struct S { 32 typedef MutableVal *iterator; 33 typedef const MutableVal *const_iterator; 34 const_iterator begin() const; 35 const_iterator end() const; 36 const_iterator cbegin() const; 37 const_iterator cend() const; 38 iterator begin(); 39 iterator end(); 40 }; 41 42 struct T { 43 typedef int value_type; 44 struct iterator { 45 value_type &operator*(); 46 const value_type &operator*() const; 47 iterator& operator ++(); 48 bool operator!=(const iterator &other); 49 void insert(value_type); 50 value_type X; 51 }; 52 iterator begin(); 53 iterator end(); 54 }; 55 56 struct U { 57 struct iterator { 58 Val& operator*(); 59 const Val& operator*()const; 60 iterator& operator ++(); 61 bool operator!=(const iterator &other); 62 Val *operator->(); 63 }; 64 iterator begin(); 65 iterator end(); 66 int X; 67 }; 68 69 struct X { 70 S Ss; 71 T Tt; 72 U Uu; 73 S getS(); 74 }; 75 76 template<typename ElemType> 77 class dependent { 78 public: 79 dependent<ElemType>(); 80 struct iterator_base { 81 const ElemType& operator*()const; 82 iterator_base& operator ++(); 83 bool operator!=(const iterator_base &other) const; 84 const ElemType *operator->() const; 85 }; 86 87 struct iterator : iterator_base { 88 ElemType& operator*(); 89 iterator& operator ++(); 90 ElemType *operator->(); 91 }; 92 93 typedef iterator_base const_iterator; 94 const_iterator begin() const; 95 const_iterator end() const; 96 iterator begin(); 97 iterator end(); 98 unsigned size() const; 99 ElemType & operator[](unsigned); 100 const ElemType & operator[](unsigned) const; 101 ElemType & at(unsigned); 102 ElemType & at(unsigned, unsigned); 103 const ElemType & at(unsigned) const; 104 105 // Intentionally evil. 106 dependent<ElemType> operator*(); 107 108 void foo(); 109 void constFoo() const; 110 }; 111 112 template<typename First, typename Second> 113 class doublyDependent{ 114 public: 115 struct Value { 116 First first; 117 Second second; 118 }; 119 120 struct iterator_base { 121 const Value& operator*()const; 122 iterator_base& operator ++(); 123 bool operator!=(const iterator_base &other) const; 124 const Value *operator->() const; 125 }; 126 127 struct iterator : iterator_base { 128 Value& operator*(); 129 Value& operator ++(); 130 Value *operator->(); 131 }; 132 133 typedef iterator_base const_iterator; 134 const_iterator begin() const; 135 const_iterator end() const; 136 iterator begin(); 137 iterator end(); 138 }; 139 140 template<typename Contained> 141 class transparent { 142 public: 143 Contained *at(); 144 Contained *operator->(); 145 Contained operator*(); 146 }; 147 148 template<typename IteratorType> 149 struct Nested { 150 typedef IteratorType* iterator; 151 typedef const IteratorType* const_iterator; 152 IteratorType *operator->(); 153 IteratorType operator*(); 154 iterator begin(); 155 iterator end(); 156 const_iterator begin() const; 157 const_iterator end() const; 158 }; 159 160 // Like llvm::SmallPtrSet, the iterator has a dereference operator that returns 161 // by value instead of by reference. 162 template <typename T> 163 struct PtrSet { 164 struct iterator { 165 bool operator!=(const iterator &other) const; 166 const T operator*(); 167 iterator &operator++(); 168 }; 169 iterator begin() const; 170 iterator end() const; 171 }; 172 173 template <typename T> 174 struct TypedefDerefContainer { 175 struct iterator { 176 typedef T &deref_type; 177 bool operator!=(const iterator &other) const; 178 deref_type operator*(); 179 iterator &operator++(); 180 }; 181 iterator begin() const; 182 iterator end() const; 183 }; 184 185 template <typename T> 186 struct RValueDerefContainer { 187 struct iterator { 188 typedef T &&deref_type; 189 bool operator!=(const iterator &other) const; 190 deref_type operator*(); 191 iterator &operator++(); 192 }; 193 iterator begin() const; 194 iterator end() const; 195 }; 196 197 namespace Macros { 198 199 struct MacroStruct { 200 int Arr[10]; 201 }; 202 static MacroStruct *MacroSt; 203 #define CONT MacroSt-> 204 205 } // namespace Macros 206 207 #endif // STRUCTURES_H 208