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 20 int count = 0; 21 22 23 // 0 args, return int 24 25 int f_int_0() 26 { 27 return 3; 28 } 29 30 struct A_int_0 31 { 32 int operator()() {return 4;} 33 }; 34 35 void test_int_0() 36 { 37 // function 38 { 39 std::function<int ()> r1(f_int_0); 40 assert(r1() == 3); 41 } 42 // function pointer 43 { 44 int (*fp)() = f_int_0; 45 std::function<int ()> r1(fp); 46 assert(r1() == 3); 47 } 48 // functor 49 { 50 A_int_0 a0; 51 std::function<int ()> r1(a0); 52 assert(r1() == 4); 53 } 54 } 55 56 57 // 0 args, return void 58 59 void f_void_0() 60 { 61 ++count; 62 } 63 64 struct A_void_0 65 { 66 void operator()() {++count;} 67 }; 68 69 void 70 test_void_0() 71 { 72 int save_count = count; 73 // function 74 { 75 std::function<void ()> r1(f_void_0); 76 r1(); 77 assert(count == save_count+1); 78 save_count = count; 79 } 80 // function pointer 81 { 82 void (*fp)() = f_void_0; 83 std::function<void ()> r1(fp); 84 r1(); 85 assert(count == save_count+1); 86 save_count = count; 87 } 88 // functor 89 { 90 A_void_0 a0; 91 std::function<void ()> r1(a0); 92 r1(); 93 assert(count == save_count+1); 94 save_count = count; 95 } 96 } 97 98 // 1 arg, return void 99 100 void f_void_1(int i) 101 { 102 count += i; 103 } 104 105 struct A_void_1 106 { 107 void operator()(int i) 108 { 109 count += i; 110 } 111 112 void mem1() {++count;} 113 void mem2() const {++count;} 114 }; 115 116 void 117 test_void_1() 118 { 119 int save_count = count; 120 // function 121 { 122 std::function<void (int)> r1(f_void_1); 123 int i = 2; 124 r1(i); 125 assert(count == save_count+2); 126 save_count = count; 127 } 128 // function pointer 129 { 130 void (*fp)(int) = f_void_1; 131 std::function<void (int)> r1(fp); 132 int i = 3; 133 r1(i); 134 assert(count == save_count+3); 135 save_count = count; 136 } 137 // functor 138 { 139 A_void_1 a0; 140 std::function<void (int)> r1(a0); 141 int i = 4; 142 r1(i); 143 assert(count == save_count+4); 144 save_count = count; 145 } 146 // member function pointer 147 { 148 void (A_void_1::*fp)() = &A_void_1::mem1; 149 std::function<void (A_void_1)> r1(fp); 150 A_void_1 a; 151 r1(a); 152 assert(count == save_count+1); 153 save_count = count; 154 A_void_1* ap = &a; 155 std::function<void (A_void_1*)> r2 = fp; 156 r2(ap); 157 assert(count == save_count+1); 158 save_count = count; 159 } 160 // const member function pointer 161 { 162 void (A_void_1::*fp)() const = &A_void_1::mem2; 163 std::function<void (A_void_1)> r1(fp); 164 A_void_1 a; 165 r1(a); 166 assert(count == save_count+1); 167 save_count = count; 168 std::function<void (A_void_1*)> r2(fp); 169 A_void_1* ap = &a; 170 r2(ap); 171 assert(count == save_count+1); 172 save_count = count; 173 } 174 } 175 176 // 1 arg, return int 177 178 int f_int_1(int i) 179 { 180 return i + 1; 181 } 182 183 struct A_int_1 184 { 185 A_int_1() : data_(5) {} 186 int operator()(int i) 187 { 188 return i - 1; 189 } 190 191 int mem1() {return 3;} 192 int mem2() const {return 4;} 193 int data_; 194 }; 195 196 void 197 test_int_1() 198 { 199 // function 200 { 201 std::function<int (int)> r1(f_int_1); 202 int i = 2; 203 assert(r1(i) == 3); 204 } 205 // function pointer 206 { 207 int (*fp)(int) = f_int_1; 208 std::function<int (int)> r1(fp); 209 int i = 3; 210 assert(r1(i) == 4); 211 } 212 // functor 213 { 214 A_int_1 a0; 215 std::function<int (int)> r1(a0); 216 int i = 4; 217 assert(r1(i) == 3); 218 } 219 // member function pointer 220 { 221 int (A_int_1::*fp)() = &A_int_1::mem1; 222 std::function<int (A_int_1)> r1(fp); 223 A_int_1 a; 224 assert(r1(a) == 3); 225 std::function<int (A_int_1*)> r2(fp); 226 A_int_1* ap = &a; 227 assert(r2(ap) == 3); 228 } 229 // const member function pointer 230 { 231 int (A_int_1::*fp)() const = &A_int_1::mem2; 232 std::function<int (A_int_1)> r1(fp); 233 A_int_1 a; 234 assert(r1(a) == 4); 235 std::function<int (A_int_1*)> r2(fp); 236 A_int_1* ap = &a; 237 assert(r2(ap) == 4); 238 } 239 // member data pointer 240 { 241 int A_int_1::*fp = &A_int_1::data_; 242 std::function<int& (A_int_1&)> r1(fp); 243 A_int_1 a; 244 assert(r1(a) == 5); 245 r1(a) = 6; 246 assert(r1(a) == 6); 247 std::function<int& (A_int_1*)> r2(fp); 248 A_int_1* ap = &a; 249 assert(r2(ap) == 6); 250 r2(ap) = 7; 251 assert(r2(ap) == 7); 252 } 253 } 254 255 // 2 arg, return void 256 257 void f_void_2(int i, int j) 258 { 259 count += i+j; 260 } 261 262 struct A_void_2 263 { 264 void operator()(int i, int j) 265 { 266 count += i+j; 267 } 268 269 void mem1(int i) {count += i;} 270 void mem2(int i) const {count += i;} 271 }; 272 273 void 274 test_void_2() 275 { 276 int save_count = count; 277 // function 278 { 279 std::function<void (int, int)> r1(f_void_2); 280 int i = 2; 281 int j = 3; 282 r1(i, j); 283 assert(count == save_count+5); 284 save_count = count; 285 } 286 // function pointer 287 { 288 void (*fp)(int, int) = f_void_2; 289 std::function<void (int, int)> r1(fp); 290 int i = 3; 291 int j = 4; 292 r1(i, j); 293 assert(count == save_count+7); 294 save_count = count; 295 } 296 // functor 297 { 298 A_void_2 a0; 299 std::function<void (int, int)> r1(a0); 300 int i = 4; 301 int j = 5; 302 r1(i, j); 303 assert(count == save_count+9); 304 save_count = count; 305 } 306 // member function pointer 307 { 308 void (A_void_2::*fp)(int) = &A_void_2::mem1; 309 std::function<void (A_void_2, int)> r1(fp); 310 A_void_2 a; 311 int i = 3; 312 r1(a, i); 313 assert(count == save_count+3); 314 save_count = count; 315 std::function<void (A_void_2*, int)> r2(fp); 316 A_void_2* ap = &a; 317 r2(ap, i); 318 assert(count == save_count+3); 319 save_count = count; 320 } 321 // const member function pointer 322 { 323 void (A_void_2::*fp)(int) const = &A_void_2::mem2; 324 std::function<void (A_void_2, int)> r1(fp); 325 A_void_2 a; 326 int i = 4; 327 r1(a, i); 328 assert(count == save_count+4); 329 save_count = count; 330 std::function<void (A_void_2*, int)> r2(fp); 331 A_void_2* ap = &a; 332 r2(ap, i); 333 assert(count == save_count+4); 334 save_count = count; 335 } 336 } 337 338 // 2 arg, return int 339 340 int f_int_2(int i, int j) 341 { 342 return i+j; 343 } 344 345 struct A_int_2 346 { 347 int operator()(int i, int j) 348 { 349 return i+j; 350 } 351 352 int mem1(int i) {return i+1;} 353 int mem2(int i) const {return i+2;} 354 }; 355 356 void test_int_2() 357 { 358 // function 359 { 360 std::function<int (int, int)> r1(f_int_2); 361 int i = 2; 362 int j = 3; 363 assert(r1(i, j) == i+j); 364 } 365 // function pointer 366 { 367 int (*fp)(int, int) = f_int_2; 368 std::function<int (int, int)> r1(fp); 369 int i = 3; 370 int j = 4; 371 assert(r1(i, j) == i+j); 372 } 373 // functor 374 { 375 A_int_2 a0; 376 std::function<int (int, int)> r1(a0); 377 int i = 4; 378 int j = 5; 379 assert(r1(i, j) == i+j); 380 } 381 // member function pointer 382 { 383 int(A_int_2::*fp)(int) = &A_int_2::mem1; 384 std::function<int (A_int_2, int)> r1(fp); 385 A_int_2 a; 386 int i = 3; 387 assert(r1(a, i) == i+1); 388 std::function<int (A_int_2*, int)> r2(fp); 389 A_int_2* ap = &a; 390 assert(r2(ap, i) == i+1); 391 } 392 // const member function pointer 393 { 394 int (A_int_2::*fp)(int) const = &A_int_2::mem2; 395 std::function<int (A_int_2, int)> r1(fp); 396 A_int_2 a; 397 int i = 4; 398 assert(r1(a, i) == i+2); 399 std::function<int (A_int_2*, int)> r2(fp); 400 A_int_2* ap = &a; 401 assert(r2(ap, i) == i+2); 402 } 403 } 404 405 int main() 406 { 407 test_void_0(); 408 test_int_0(); 409 test_void_1(); 410 test_int_1(); 411 test_void_2(); 412 test_int_2(); 413 } 414