1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // <functional> 11 12 // class function<R(ArgTypes...)> 13 14 // R operator()(ArgTypes... args) const 15 16 #include <functional> 17 #include <cassert> 18 19 int count = 0; 20 21 // 1 arg, return void 22 23 void f_void_1(int i) 24 { 25 count += i; 26 } 27 28 struct A_void_1 29 { 30 void operator()(int i) 31 { 32 count += i; 33 } 34 35 void mem1() {++count;} 36 void mem2() const {++count;} 37 }; 38 39 void 40 test_void_1() 41 { 42 int save_count = count; 43 // function 44 { 45 std::function<void (int)> r1(f_void_1); 46 int i = 2; 47 r1(i); 48 assert(count == save_count+2); 49 save_count = count; 50 } 51 // function pointer 52 { 53 void (*fp)(int) = f_void_1; 54 std::function<void (int)> r1(fp); 55 int i = 3; 56 r1(i); 57 assert(count == save_count+3); 58 save_count = count; 59 } 60 // functor 61 { 62 A_void_1 a0; 63 std::function<void (int)> r1(a0); 64 int i = 4; 65 r1(i); 66 assert(count == save_count+4); 67 save_count = count; 68 } 69 // member function pointer 70 { 71 void (A_void_1::*fp)() = &A_void_1::mem1; 72 std::function<void (A_void_1)> r1(fp); 73 A_void_1 a; 74 r1(a); 75 assert(count == save_count+1); 76 save_count = count; 77 A_void_1* ap = &a; 78 std::function<void (A_void_1*)> r2 = fp; 79 r2(ap); 80 assert(count == save_count+1); 81 save_count = count; 82 } 83 // const member function pointer 84 { 85 void (A_void_1::*fp)() const = &A_void_1::mem2; 86 std::function<void (A_void_1)> r1(fp); 87 A_void_1 a; 88 r1(a); 89 assert(count == save_count+1); 90 save_count = count; 91 std::function<void (A_void_1*)> r2(fp); 92 A_void_1* ap = &a; 93 r2(ap); 94 assert(count == save_count+1); 95 save_count = count; 96 } 97 } 98 99 // 1 arg, return int 100 101 int f_int_1(int i) 102 { 103 return i + 1; 104 } 105 106 struct A_int_1 107 { 108 A_int_1() : data_(5) {} 109 int operator()(int i) 110 { 111 return i - 1; 112 } 113 114 int mem1() {return 3;} 115 int mem2() const {return 4;} 116 int data_; 117 }; 118 119 void 120 test_int_1() 121 { 122 // function 123 { 124 std::function<int (int)> r1(f_int_1); 125 int i = 2; 126 assert(r1(i) == 3); 127 } 128 // function pointer 129 { 130 int (*fp)(int) = f_int_1; 131 std::function<int (int)> r1(fp); 132 int i = 3; 133 assert(r1(i) == 4); 134 } 135 // functor 136 { 137 A_int_1 a0; 138 std::function<int (int)> r1(a0); 139 int i = 4; 140 assert(r1(i) == 3); 141 } 142 // member function pointer 143 { 144 int (A_int_1::*fp)() = &A_int_1::mem1; 145 std::function<int (A_int_1)> r1(fp); 146 A_int_1 a; 147 assert(r1(a) == 3); 148 std::function<int (A_int_1*)> r2(fp); 149 A_int_1* ap = &a; 150 assert(r2(ap) == 3); 151 } 152 // const member function pointer 153 { 154 int (A_int_1::*fp)() const = &A_int_1::mem2; 155 std::function<int (A_int_1)> r1(fp); 156 A_int_1 a; 157 assert(r1(a) == 4); 158 std::function<int (A_int_1*)> r2(fp); 159 A_int_1* ap = &a; 160 assert(r2(ap) == 4); 161 } 162 // member data pointer 163 { 164 int A_int_1::*fp = &A_int_1::data_; 165 std::function<int& (A_int_1&)> r1(fp); 166 A_int_1 a; 167 assert(r1(a) == 5); 168 r1(a) = 6; 169 assert(r1(a) == 6); 170 std::function<int& (A_int_1*)> r2(fp); 171 A_int_1* ap = &a; 172 assert(r2(ap) == 6); 173 r2(ap) = 7; 174 assert(r2(ap) == 7); 175 } 176 } 177 178 // 2 arg, return void 179 180 void f_void_2(int i, int j) 181 { 182 count += i+j; 183 } 184 185 struct A_void_2 186 { 187 void operator()(int i, int j) 188 { 189 count += i+j; 190 } 191 192 void mem1(int i) {count += i;} 193 void mem2(int i) const {count += i;} 194 }; 195 196 void 197 test_void_2() 198 { 199 int save_count = count; 200 // function 201 { 202 std::function<void (int, int)> r1(f_void_2); 203 int i = 2; 204 int j = 3; 205 r1(i, j); 206 assert(count == save_count+5); 207 save_count = count; 208 } 209 // function pointer 210 { 211 void (*fp)(int, int) = f_void_2; 212 std::function<void (int, int)> r1(fp); 213 int i = 3; 214 int j = 4; 215 r1(i, j); 216 assert(count == save_count+7); 217 save_count = count; 218 } 219 // functor 220 { 221 A_void_2 a0; 222 std::function<void (int, int)> r1(a0); 223 int i = 4; 224 int j = 5; 225 r1(i, j); 226 assert(count == save_count+9); 227 save_count = count; 228 } 229 // member function pointer 230 { 231 void (A_void_2::*fp)(int) = &A_void_2::mem1; 232 std::function<void (A_void_2, int)> r1(fp); 233 A_void_2 a; 234 int i = 3; 235 r1(a, i); 236 assert(count == save_count+3); 237 save_count = count; 238 std::function<void (A_void_2*, int)> r2(fp); 239 A_void_2* ap = &a; 240 r2(ap, i); 241 assert(count == save_count+3); 242 save_count = count; 243 } 244 // const member function pointer 245 { 246 void (A_void_2::*fp)(int) const = &A_void_2::mem2; 247 std::function<void (A_void_2, int)> r1(fp); 248 A_void_2 a; 249 int i = 4; 250 r1(a, i); 251 assert(count == save_count+4); 252 save_count = count; 253 std::function<void (A_void_2*, int)> r2(fp); 254 A_void_2* ap = &a; 255 r2(ap, i); 256 assert(count == save_count+4); 257 save_count = count; 258 } 259 } 260 261 // 2 arg, return int 262 263 int f_int_2(int i, int j) 264 { 265 return i+j; 266 } 267 268 struct A_int_2 269 { 270 int operator()(int i, int j) 271 { 272 return i+j; 273 } 274 275 int mem1(int i) {return i+1;} 276 int mem2(int i) const {return i+2;} 277 }; 278 279 void 280 testint_2() 281 { 282 // function 283 { 284 std::function<int (int, int)> r1(f_int_2); 285 int i = 2; 286 int j = 3; 287 assert(r1(i, j) == i+j); 288 } 289 // function pointer 290 { 291 int (*fp)(int, int) = f_int_2; 292 std::function<int (int, int)> r1(fp); 293 int i = 3; 294 int j = 4; 295 assert(r1(i, j) == i+j); 296 } 297 // functor 298 { 299 A_int_2 a0; 300 std::function<int (int, int)> r1(a0); 301 int i = 4; 302 int j = 5; 303 assert(r1(i, j) == i+j); 304 } 305 // member function pointer 306 { 307 int(A_int_2::*fp)(int) = &A_int_2::mem1; 308 std::function<int (A_int_2, int)> r1(fp); 309 A_int_2 a; 310 int i = 3; 311 assert(r1(a, i) == i+1); 312 std::function<int (A_int_2*, int)> r2(fp); 313 A_int_2* ap = &a; 314 assert(r2(ap, i) == i+1); 315 } 316 // const member function pointer 317 { 318 int (A_int_2::*fp)(int) const = &A_int_2::mem2; 319 std::function<int (A_int_2, int)> r1(fp); 320 A_int_2 a; 321 int i = 4; 322 assert(r1(a, i) == i+2); 323 std::function<int (A_int_2*, int)> r2(fp); 324 A_int_2* ap = &a; 325 assert(r2(ap, i) == i+2); 326 } 327 } 328 329 int main() 330 { 331 test_void_1(); 332 test_int_1(); 333 test_void_2(); 334 testint_2(); 335 } 336