annotate DEPENDENCIES/generic/include/boost/lambda/detail/function_adaptors.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 // Boost Lambda Library - function_adaptors.hpp ----------------------------
Chris@16 2
Chris@16 3 // Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
Chris@16 4 //
Chris@16 5 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 6 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 7 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8 //
Chris@16 9 // For more information, see www.boost.org
Chris@16 10
Chris@16 11
Chris@16 12 #ifndef BOOST_LAMBDA_FUNCTION_ADAPTORS_HPP
Chris@16 13 #define BOOST_LAMBDA_FUNCTION_ADAPTORS_HPP
Chris@16 14
Chris@16 15 #include "boost/mpl/has_xxx.hpp"
Chris@16 16 #include "boost/tuple/tuple.hpp"
Chris@16 17 #include "boost/type_traits/same_traits.hpp"
Chris@16 18 #include "boost/type_traits/remove_reference.hpp"
Chris@16 19 #include "boost/type_traits/remove_cv.hpp"
Chris@16 20 #include "boost/type_traits/add_const.hpp"
Chris@16 21 #include "boost/type_traits/add_volatile.hpp"
Chris@16 22 #include "boost/utility/result_of.hpp"
Chris@16 23
Chris@16 24 namespace boost {
Chris@16 25 namespace lambda {
Chris@16 26
Chris@16 27 namespace detail {
Chris@16 28
Chris@16 29 BOOST_MPL_HAS_XXX_TEMPLATE_DEF(sig)
Chris@16 30
Chris@16 31 template<class Tuple>
Chris@16 32 struct remove_references_from_elements {
Chris@16 33 typedef typename boost::tuples::cons<
Chris@16 34 typename boost::remove_reference<typename Tuple::head_type>::type,
Chris@16 35 typename remove_references_from_elements<typename Tuple::tail_type>::type
Chris@16 36 > type;
Chris@16 37 };
Chris@16 38
Chris@16 39 template<>
Chris@16 40 struct remove_references_from_elements<boost::tuples::null_type> {
Chris@16 41 typedef boost::tuples::null_type type;
Chris@16 42 };
Chris@16 43
Chris@16 44 }
Chris@16 45
Chris@16 46 template <class Func> struct function_adaptor {
Chris@16 47
Chris@16 48 typedef typename detail::remove_reference_and_cv<Func>::type plainF;
Chris@16 49
Chris@16 50 #if !defined(BOOST_NO_RESULT_OF)
Chris@16 51 // Support functors that use the boost::result_of return type convention.
Chris@16 52 template<class Tuple, int Length, bool HasSig>
Chris@16 53 struct result_converter;
Chris@16 54 template<class Tuple, int Length>
Chris@16 55 struct result_converter<Tuple, Length, true>
Chris@16 56 : plainF::template sig<
Chris@16 57 typename detail::remove_references_from_elements<Tuple>::type
Chris@16 58 >
Chris@16 59 {};
Chris@16 60 template<class Tuple>
Chris@16 61 struct result_converter<Tuple, 0, false>
Chris@16 62 : result_of<plainF()>
Chris@16 63 {};
Chris@16 64 template<class Tuple>
Chris@16 65 struct result_converter<Tuple, 1, false>
Chris@16 66 : result_of<plainF(
Chris@16 67 typename tuples::element<1, Tuple>::type)
Chris@16 68 >
Chris@16 69 {};
Chris@16 70 template<class Tuple>
Chris@16 71 struct result_converter<Tuple, 2, false>
Chris@16 72 : result_of<plainF(
Chris@16 73 typename tuples::element<1, Tuple>::type,
Chris@16 74 typename tuples::element<2, Tuple>::type)
Chris@16 75 >
Chris@16 76 {};
Chris@16 77 template<class Tuple>
Chris@16 78 struct result_converter<Tuple, 3, false>
Chris@16 79 : result_of<plainF(
Chris@16 80 typename tuples::element<1, Tuple>::type,
Chris@16 81 typename tuples::element<2, Tuple>::type,
Chris@16 82 typename tuples::element<3, Tuple>::type)
Chris@16 83 >
Chris@16 84 {};
Chris@16 85 template<class Tuple>
Chris@16 86 struct result_converter<Tuple, 4, false>
Chris@16 87 : result_of<plainF(
Chris@16 88 typename tuples::element<1, Tuple>::type,
Chris@16 89 typename tuples::element<2, Tuple>::type,
Chris@16 90 typename tuples::element<3, Tuple>::type,
Chris@16 91 typename tuples::element<4, Tuple>::type)
Chris@16 92 >
Chris@16 93 {};
Chris@16 94 template<class Tuple>
Chris@16 95 struct result_converter<Tuple, 5, false>
Chris@16 96 : result_of<plainF(
Chris@16 97 typename tuples::element<1, Tuple>::type,
Chris@16 98 typename tuples::element<2, Tuple>::type,
Chris@16 99 typename tuples::element<3, Tuple>::type,
Chris@16 100 typename tuples::element<4, Tuple>::type,
Chris@16 101 typename tuples::element<5, Tuple>::type)
Chris@16 102 >
Chris@16 103 {};
Chris@16 104 template<class Tuple>
Chris@16 105 struct result_converter<Tuple, 6, false>
Chris@16 106 : result_of<plainF(
Chris@16 107 typename tuples::element<1, Tuple>::type,
Chris@16 108 typename tuples::element<2, Tuple>::type,
Chris@16 109 typename tuples::element<3, Tuple>::type,
Chris@16 110 typename tuples::element<4, Tuple>::type,
Chris@16 111 typename tuples::element<5, Tuple>::type,
Chris@16 112 typename tuples::element<6, Tuple>::type)
Chris@16 113 >
Chris@16 114 {};
Chris@16 115 template<class Tuple>
Chris@16 116 struct result_converter<Tuple, 7, false>
Chris@16 117 : result_of<plainF(
Chris@16 118 typename tuples::element<1, Tuple>::type,
Chris@16 119 typename tuples::element<2, Tuple>::type,
Chris@16 120 typename tuples::element<3, Tuple>::type,
Chris@16 121 typename tuples::element<4, Tuple>::type,
Chris@16 122 typename tuples::element<5, Tuple>::type,
Chris@16 123 typename tuples::element<6, Tuple>::type,
Chris@16 124 typename tuples::element<7, Tuple>::type)
Chris@16 125 >
Chris@16 126 {};
Chris@16 127 template<class Tuple>
Chris@16 128 struct result_converter<Tuple, 8, false>
Chris@16 129 : result_of<plainF(
Chris@16 130 typename tuples::element<1, Tuple>::type,
Chris@16 131 typename tuples::element<2, Tuple>::type,
Chris@16 132 typename tuples::element<3, Tuple>::type,
Chris@16 133 typename tuples::element<4, Tuple>::type,
Chris@16 134 typename tuples::element<5, Tuple>::type,
Chris@16 135 typename tuples::element<6, Tuple>::type,
Chris@16 136 typename tuples::element<7, Tuple>::type,
Chris@16 137 typename tuples::element<8, Tuple>::type)
Chris@16 138 >
Chris@16 139 {};
Chris@16 140 template<class Tuple>
Chris@16 141 struct result_converter<Tuple, 9, false>
Chris@16 142 : result_of<plainF(
Chris@16 143 typename tuples::element<1, Tuple>::type,
Chris@16 144 typename tuples::element<2, Tuple>::type,
Chris@16 145 typename tuples::element<3, Tuple>::type,
Chris@16 146 typename tuples::element<4, Tuple>::type,
Chris@16 147 typename tuples::element<5, Tuple>::type,
Chris@16 148 typename tuples::element<6, Tuple>::type,
Chris@16 149 typename tuples::element<7, Tuple>::type,
Chris@16 150 typename tuples::element<8, Tuple>::type,
Chris@16 151 typename tuples::element<9, Tuple>::type)
Chris@16 152 >
Chris@16 153 {};
Chris@16 154
Chris@16 155 // we do not know the return type off-hand, we must ask it from Func
Chris@16 156 // To sig we pass a cons list, where the head is the function object type
Chris@16 157 // itself (potentially cv-qualified)
Chris@16 158 // and the tail contains the types of the actual arguments to be passed
Chris@16 159 // to the function object. The arguments can be cv qualified
Chris@16 160 // as well.
Chris@16 161 template <class Args>
Chris@16 162 struct sig
Chris@16 163 : result_converter<
Chris@16 164 Args
Chris@16 165 , tuples::length<typename Args::tail_type>::value
Chris@16 166 , detail::has_sig<plainF>::value
Chris@16 167 >
Chris@16 168 {};
Chris@16 169 #else // BOOST_NO_RESULT_OF
Chris@16 170
Chris@16 171 template <class Args> class sig {
Chris@16 172 typedef typename detail::remove_reference_and_cv<Func>::type plainF;
Chris@16 173 public:
Chris@16 174 typedef typename plainF::template sig<
Chris@16 175 typename detail::remove_references_from_elements<Args>::type
Chris@16 176 >::type type;
Chris@16 177 };
Chris@16 178 #endif
Chris@16 179
Chris@16 180 template<class RET, class A1>
Chris@16 181 static RET apply(A1& a1) {
Chris@16 182 return a1();
Chris@16 183 }
Chris@16 184 template<class RET, class A1, class A2>
Chris@16 185 static RET apply(A1& a1, A2& a2) {
Chris@16 186 return a1(a2);
Chris@16 187 }
Chris@16 188 template<class RET, class A1, class A2, class A3>
Chris@16 189 static RET apply(A1& a1, A2& a2, A3& a3) {
Chris@16 190 return a1(a2, a3);
Chris@16 191 }
Chris@16 192 template<class RET, class A1, class A2, class A3, class A4>
Chris@16 193 static RET apply(A1& a1, A2& a2, A3& a3, A4& a4) {
Chris@16 194 return a1(a2, a3, a4);
Chris@16 195 }
Chris@16 196 template<class RET, class A1, class A2, class A3, class A4, class A5>
Chris@16 197 static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) {
Chris@16 198 return a1(a2, a3, a4, a5);
Chris@16 199 }
Chris@16 200 template<class RET, class A1, class A2, class A3, class A4, class A5, class A6>
Chris@16 201 static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) {
Chris@16 202 return a1(a2, a3, a4, a5, a6);
Chris@16 203 }
Chris@16 204 template<class RET, class A1, class A2, class A3, class A4, class A5, class A6,
Chris@16 205 class A7>
Chris@16 206 static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6,
Chris@16 207 A7& a7) {
Chris@16 208 return a1(a2, a3, a4, a5, a6, a7);
Chris@16 209 }
Chris@16 210 template<class RET, class A1, class A2, class A3, class A4, class A5, class A6,
Chris@16 211 class A7, class A8>
Chris@16 212 static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6,
Chris@16 213 A7& a7, A8& a8) {
Chris@16 214 return a1(a2, a3, a4, a5, a6, a7, a8);
Chris@16 215 }
Chris@16 216 template<class RET, class A1, class A2, class A3, class A4, class A5, class A6,
Chris@16 217 class A7, class A8, class A9>
Chris@16 218 static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6,
Chris@16 219 A7& a7, A8& a8, A9& a9) {
Chris@16 220 return a1(a2, a3, a4, a5, a6, a7, a8, a9);
Chris@16 221 }
Chris@16 222 template<class RET, class A1, class A2, class A3, class A4, class A5, class A6,
Chris@16 223 class A7, class A8, class A9, class A10>
Chris@16 224 static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6,
Chris@16 225 A7& a7, A8& a8, A9& a9, A10& a10) {
Chris@16 226 return a1(a2, a3, a4, a5, a6, a7, a8, a9, a10);
Chris@16 227 }
Chris@16 228 };
Chris@16 229
Chris@16 230 template <class Func> struct function_adaptor<const Func>; // error
Chris@16 231
Chris@16 232 // -- function adaptors with data member access
Chris@16 233 template <class Object, class T>
Chris@16 234 struct function_adaptor<T Object::*> {
Chris@16 235
Chris@16 236 // typedef detail::unspecified type;
Chris@16 237
Chris@16 238 // T can have qualifiers and can be a reference type
Chris@16 239 // We get the return type by adding const, if the object through which
Chris@16 240 // the data member is accessed is const, and finally adding a reference
Chris@16 241 template<class Args> class sig {
Chris@16 242 typedef typename boost::tuples::element<1, Args>::type argument_type;
Chris@16 243 typedef typename boost::remove_reference<
Chris@16 244 argument_type
Chris@16 245 >::type unref_type;
Chris@16 246
Chris@16 247 typedef typename detail::IF<boost::is_const<unref_type>::value,
Chris@16 248 typename boost::add_const<T>::type,
Chris@16 249 T
Chris@16 250 >::RET properly_consted_return_type;
Chris@16 251
Chris@16 252 typedef typename detail::IF<boost::is_volatile<unref_type>::value,
Chris@16 253 typename boost::add_volatile<properly_consted_return_type>::type,
Chris@16 254 properly_consted_return_type
Chris@16 255 >::RET properly_cvd_return_type;
Chris@16 256
Chris@16 257
Chris@16 258 public:
Chris@16 259 typedef typename detail::IF<boost::is_reference<argument_type>::value,
Chris@16 260 typename boost::add_reference<properly_cvd_return_type>::type,
Chris@16 261 typename boost::remove_cv<T>::type
Chris@16 262 >::RET type;
Chris@16 263 };
Chris@16 264
Chris@16 265 template <class RET>
Chris@16 266 static RET apply( T Object::*data, Object& o) {
Chris@16 267 return o.*data;
Chris@16 268 }
Chris@16 269 template <class RET>
Chris@16 270 static RET apply( T Object::*data, const Object& o) {
Chris@16 271 return o.*data;
Chris@16 272 }
Chris@16 273 template <class RET>
Chris@16 274 static RET apply( T Object::*data, volatile Object& o) {
Chris@16 275 return o.*data;
Chris@16 276 }
Chris@16 277 template <class RET>
Chris@16 278 static RET apply( T Object::*data, const volatile Object& o) {
Chris@16 279 return o.*data;
Chris@16 280 }
Chris@16 281 template <class RET>
Chris@16 282 static RET apply( T Object::*data, Object* o) {
Chris@16 283 return o->*data;
Chris@16 284 }
Chris@16 285 template <class RET>
Chris@16 286 static RET apply( T Object::*data, const Object* o) {
Chris@16 287 return o->*data;
Chris@16 288 }
Chris@16 289 template <class RET>
Chris@16 290 static RET apply( T Object::*data, volatile Object* o) {
Chris@16 291 return o->*data;
Chris@16 292 }
Chris@16 293 template <class RET>
Chris@16 294 static RET apply( T Object::*data, const volatile Object* o) {
Chris@16 295 return o->*data;
Chris@16 296 }
Chris@16 297 };
Chris@16 298
Chris@16 299 // -- function adaptors with 1 argument apply
Chris@16 300
Chris@16 301 template <class Result>
Chris@16 302 struct function_adaptor<Result (void)> {
Chris@16 303
Chris@16 304 template<class T> struct sig { typedef Result type; };
Chris@16 305 template <class RET>
Chris@16 306 static Result apply(Result (*func)()) {
Chris@16 307 return func();
Chris@16 308 }
Chris@16 309 };
Chris@16 310
Chris@16 311 template <class Result>
Chris@16 312 struct function_adaptor<Result (*)(void)> {
Chris@16 313
Chris@16 314 template<class T> struct sig { typedef Result type; };
Chris@16 315 template <class RET>
Chris@16 316 static Result apply(Result (*func)()) {
Chris@16 317 return func();
Chris@16 318 }
Chris@16 319 };
Chris@16 320
Chris@16 321
Chris@16 322 // -- function adaptors with 2 argument apply
Chris@16 323 template <class Object, class Result>
Chris@16 324 struct function_adaptor<Result (Object::*)() const> {
Chris@16 325
Chris@16 326 template<class T> struct sig { typedef Result type; };
Chris@16 327 template <class RET>
Chris@16 328 static Result apply( Result (Object::*func)() const, const Object* o) {
Chris@16 329 return (o->*func)();
Chris@16 330 }
Chris@16 331 template <class RET>
Chris@16 332 static Result apply( Result (Object::*func)() const, const Object& o) {
Chris@16 333 return (o.*func)();
Chris@16 334 }
Chris@16 335 };
Chris@16 336
Chris@16 337 template <class Object, class Result>
Chris@16 338 struct function_adaptor<Result (Object::*)()> {
Chris@16 339
Chris@16 340 template<class T> struct sig { typedef Result type; };
Chris@16 341 template <class RET>
Chris@16 342 static Result apply( Result (Object::*func)(), Object* o) {
Chris@16 343 return (o->*func)();
Chris@16 344 }
Chris@16 345 template <class RET>
Chris@16 346 static Result apply( Result (Object::*func)(), Object& o) {
Chris@16 347 return (o.*func)();
Chris@16 348 }
Chris@16 349 };
Chris@16 350
Chris@16 351 template <class Arg1, class Result>
Chris@16 352 struct function_adaptor<Result (Arg1)> {
Chris@16 353
Chris@16 354 template<class T> struct sig { typedef Result type; };
Chris@16 355 template <class RET, class A1>
Chris@16 356 static Result apply(Result (*func)(Arg1), A1& a1) {
Chris@16 357 return func(a1);
Chris@16 358 }
Chris@16 359 };
Chris@16 360
Chris@16 361 template <class Arg1, class Result>
Chris@16 362 struct function_adaptor<Result (*)(Arg1)> {
Chris@16 363
Chris@16 364 template<class T> struct sig { typedef Result type; };
Chris@16 365 template <class RET, class A1>
Chris@16 366 static Result apply(Result (*func)(Arg1), A1& a1) {
Chris@16 367 return func(a1);
Chris@16 368 }
Chris@16 369 };
Chris@16 370
Chris@16 371
Chris@16 372 // -- function adaptors with 3 argument apply
Chris@16 373 template <class Object, class Arg1, class Result>
Chris@16 374 struct function_adaptor<Result (Object::*)(Arg1) const> {
Chris@16 375
Chris@16 376 template<class T> struct sig { typedef Result type; };
Chris@16 377 template <class RET, class A1>
Chris@16 378 static Result apply( Result (Object::*func)(Arg1) const, const Object* o,
Chris@16 379 A1& a1) {
Chris@16 380 return (o->*func)(a1);
Chris@16 381 }
Chris@16 382 template <class RET, class A1>
Chris@16 383 static Result apply( Result (Object::*func)(Arg1) const, const Object& o,
Chris@16 384 A1& a1) {
Chris@16 385 return (o.*func)(a1);
Chris@16 386 }
Chris@16 387 };
Chris@16 388
Chris@16 389 template <class Object, class Arg1, class Result>
Chris@16 390 struct function_adaptor<Result (Object::*)(Arg1)> {
Chris@16 391
Chris@16 392 template<class T> struct sig { typedef Result type; };
Chris@16 393 template <class RET, class A1>
Chris@16 394 static Result apply( Result (Object::*func)(Arg1), Object* o, A1& a1) {
Chris@16 395 return (o->*func)(a1);
Chris@16 396 }
Chris@16 397 template <class RET, class A1>
Chris@16 398 static Result apply( Result (Object::*func)(Arg1), Object& o, A1& a1) {
Chris@16 399 return (o.*func)(a1);
Chris@16 400 }
Chris@16 401 };
Chris@16 402
Chris@16 403 template <class Arg1, class Arg2, class Result>
Chris@16 404 struct function_adaptor<Result (Arg1, Arg2)> {
Chris@16 405
Chris@16 406 template<class T> struct sig { typedef Result type; };
Chris@16 407 template <class RET, class A1, class A2>
Chris@16 408 static Result apply(Result (*func)(Arg1, Arg2), A1& a1, A2& a2) {
Chris@16 409 return func(a1, a2);
Chris@16 410 }
Chris@16 411 };
Chris@16 412
Chris@16 413 template <class Arg1, class Arg2, class Result>
Chris@16 414 struct function_adaptor<Result (*)(Arg1, Arg2)> {
Chris@16 415
Chris@16 416 template<class T> struct sig { typedef Result type; };
Chris@16 417 template <class RET, class A1, class A2>
Chris@16 418 static Result apply(Result (*func)(Arg1, Arg2), A1& a1, A2& a2) {
Chris@16 419 return func(a1, a2);
Chris@16 420 }
Chris@16 421 };
Chris@16 422
Chris@16 423
Chris@16 424 // -- function adaptors with 4 argument apply
Chris@16 425 template <class Object, class Arg1, class Arg2, class Result>
Chris@16 426 struct function_adaptor<Result (Object::*)(Arg1, Arg2) const> {
Chris@16 427
Chris@16 428 template<class T> struct sig { typedef Result type; };
Chris@16 429 template <class RET, class A1, class A2>
Chris@16 430 static Result apply( Result (Object::*func)(Arg1, Arg2) const, const Object* o, A1& a1, A2& a2) {
Chris@16 431 return (o->*func)(a1, a2);
Chris@16 432 }
Chris@16 433 template <class RET, class A1, class A2>
Chris@16 434 static Result apply( Result (Object::*func)(Arg1, Arg2) const, const Object& o, A1& a1, A2& a2) {
Chris@16 435 return (o.*func)(a1, a2);
Chris@16 436 }
Chris@16 437 };
Chris@16 438
Chris@16 439 template <class Object, class Arg1, class Arg2, class Result>
Chris@16 440 struct function_adaptor<Result (Object::*)(Arg1, Arg2)> {
Chris@16 441
Chris@16 442 template<class T> struct sig { typedef Result type; };
Chris@16 443 template <class RET, class A1, class A2>
Chris@16 444 static Result apply( Result (Object::*func)(Arg1, Arg2), Object* o, A1& a1, A2& a2) {
Chris@16 445 return (o->*func)(a1, a2);
Chris@16 446 }
Chris@16 447 template <class RET, class A1, class A2>
Chris@16 448 static Result apply( Result (Object::*func)(Arg1, Arg2), Object& o, A1& a1, A2& a2) {
Chris@16 449 return (o.*func)(a1, a2);
Chris@16 450 }
Chris@16 451 };
Chris@16 452
Chris@16 453 template <class Arg1, class Arg2, class Arg3, class Result>
Chris@16 454 struct function_adaptor<Result (Arg1, Arg2, Arg3)> {
Chris@16 455
Chris@16 456 template<class T> struct sig { typedef Result type; };
Chris@16 457 template <class RET, class A1, class A2, class A3>
Chris@16 458 static Result apply(Result (*func)(Arg1, Arg2, Arg3), A1& a1, A2& a2, A3& a3) {
Chris@16 459 return func(a1, a2, a3);
Chris@16 460 }
Chris@16 461 };
Chris@16 462
Chris@16 463 template <class Arg1, class Arg2, class Arg3, class Result>
Chris@16 464 struct function_adaptor<Result (*)(Arg1, Arg2, Arg3)> {
Chris@16 465
Chris@16 466 template<class T> struct sig { typedef Result type; };
Chris@16 467 template <class RET, class A1, class A2, class A3>
Chris@16 468 static Result apply(Result (*func)(Arg1, Arg2, Arg3), A1& a1, A2& a2, A3& a3) {
Chris@16 469 return func(a1, a2, a3);
Chris@16 470 }
Chris@16 471 };
Chris@16 472
Chris@16 473
Chris@16 474 // -- function adaptors with 5 argument apply
Chris@16 475 template <class Object, class Arg1, class Arg2, class Arg3, class Result>
Chris@16 476 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3) const> {
Chris@16 477
Chris@16 478 template<class T> struct sig { typedef Result type; };
Chris@16 479 template <class RET, class A1, class A2, class A3>
Chris@16 480 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3) const, const Object* o, A1& a1, A2& a2, A3& a3) {
Chris@16 481 return (o->*func)(a1, a2, a3);
Chris@16 482 }
Chris@16 483 template <class RET, class A1, class A2, class A3>
Chris@16 484 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3) const, const Object& o, A1& a1, A2& a2, A3& a3) {
Chris@16 485 return (o.*func)(a1, a2, a3);
Chris@16 486 }
Chris@16 487 };
Chris@16 488
Chris@16 489 template <class Object, class Arg1, class Arg2, class Arg3, class Result>
Chris@16 490 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3)> {
Chris@16 491
Chris@16 492 template<class T> struct sig { typedef Result type; };
Chris@16 493 template <class RET, class A1, class A2, class A3>
Chris@16 494 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3), Object* o, A1& a1, A2& a2, A3& a3) {
Chris@16 495 return (o->*func)(a1, a2, a3);
Chris@16 496 }
Chris@16 497 template <class RET, class A1, class A2, class A3>
Chris@16 498 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3), Object& o, A1& a1, A2& a2, A3& a3) {
Chris@16 499 return (o.*func)(a1, a2, a3);
Chris@16 500 }
Chris@16 501 };
Chris@16 502
Chris@16 503 template <class Arg1, class Arg2, class Arg3, class Arg4, class Result>
Chris@16 504 struct function_adaptor<Result (Arg1, Arg2, Arg3, Arg4)> {
Chris@16 505
Chris@16 506 template<class T> struct sig { typedef Result type; };
Chris@16 507 template <class RET, class A1, class A2, class A3, class A4>
Chris@16 508 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4), A1& a1, A2& a2, A3& a3, A4& a4) {
Chris@16 509 return func(a1, a2, a3, a4);
Chris@16 510 }
Chris@16 511 };
Chris@16 512
Chris@16 513 template <class Arg1, class Arg2, class Arg3, class Arg4, class Result>
Chris@16 514 struct function_adaptor<Result (*)(Arg1, Arg2, Arg3, Arg4)> {
Chris@16 515
Chris@16 516 template<class T> struct sig { typedef Result type; };
Chris@16 517 template <class RET, class A1, class A2, class A3, class A4>
Chris@16 518 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4), A1& a1, A2& a2, A3& a3, A4& a4) {
Chris@16 519 return func(a1, a2, a3, a4);
Chris@16 520 }
Chris@16 521 };
Chris@16 522
Chris@16 523
Chris@16 524 // -- function adaptors with 6 argument apply
Chris@16 525 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Result>
Chris@16 526 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4) const> {
Chris@16 527
Chris@16 528 template<class T> struct sig { typedef Result type; };
Chris@16 529 template <class RET, class A1, class A2, class A3, class A4>
Chris@16 530 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4) const, const Object* o, A1& a1, A2& a2, A3& a3, A4& a4) {
Chris@16 531 return (o->*func)(a1, a2, a3, a4);
Chris@16 532 }
Chris@16 533 template <class RET, class A1, class A2, class A3, class A4>
Chris@16 534 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4) const, const Object& o, A1& a1, A2& a2, A3& a3, A4& a4) {
Chris@16 535 return (o.*func)(a1, a2, a3, a4);
Chris@16 536 }
Chris@16 537 };
Chris@16 538
Chris@16 539 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Result>
Chris@16 540 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4)> {
Chris@16 541
Chris@16 542 template<class T> struct sig { typedef Result type; };
Chris@16 543 template <class RET, class A1, class A2, class A3, class A4>
Chris@16 544 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4), Object* o, A1& a1, A2& a2, A3& a3, A4& a4) {
Chris@16 545 return (o->*func)(a1, a2, a3, a4);
Chris@16 546 }
Chris@16 547 template <class RET, class A1, class A2, class A3, class A4>
Chris@16 548 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4), Object& o, A1& a1, A2& a2, A3& a3, A4& a4) {
Chris@16 549 return (o.*func)(a1, a2, a3, a4);
Chris@16 550 }
Chris@16 551 };
Chris@16 552
Chris@16 553 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Result>
Chris@16 554 struct function_adaptor<Result (Arg1, Arg2, Arg3, Arg4, Arg5)> {
Chris@16 555
Chris@16 556 template<class T> struct sig { typedef Result type; };
Chris@16 557 template <class RET, class A1, class A2, class A3, class A4, class A5>
Chris@16 558 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) {
Chris@16 559 return func(a1, a2, a3, a4, a5);
Chris@16 560 }
Chris@16 561 };
Chris@16 562
Chris@16 563 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Result>
Chris@16 564 struct function_adaptor<Result (*)(Arg1, Arg2, Arg3, Arg4, Arg5)> {
Chris@16 565
Chris@16 566 template<class T> struct sig { typedef Result type; };
Chris@16 567 template <class RET, class A1, class A2, class A3, class A4, class A5>
Chris@16 568 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) {
Chris@16 569 return func(a1, a2, a3, a4, a5);
Chris@16 570 }
Chris@16 571 };
Chris@16 572
Chris@16 573
Chris@16 574 // -- function adaptors with 7 argument apply
Chris@16 575 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Result>
Chris@16 576 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5) const> {
Chris@16 577
Chris@16 578 template<class T> struct sig { typedef Result type; };
Chris@16 579 template <class RET, class A1, class A2, class A3, class A4, class A5>
Chris@16 580 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5) const, const Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) {
Chris@16 581 return (o->*func)(a1, a2, a3, a4, a5);
Chris@16 582 }
Chris@16 583 template <class RET, class A1, class A2, class A3, class A4, class A5>
Chris@16 584 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5) const, const Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) {
Chris@16 585 return (o.*func)(a1, a2, a3, a4, a5);
Chris@16 586 }
Chris@16 587 };
Chris@16 588
Chris@16 589 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Result>
Chris@16 590 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5)> {
Chris@16 591
Chris@16 592 template<class T> struct sig { typedef Result type; };
Chris@16 593 template <class RET, class A1, class A2, class A3, class A4, class A5>
Chris@16 594 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5), Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) {
Chris@16 595 return (o->*func)(a1, a2, a3, a4, a5);
Chris@16 596 }
Chris@16 597 template <class RET, class A1, class A2, class A3, class A4, class A5>
Chris@16 598 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5), Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) {
Chris@16 599 return (o.*func)(a1, a2, a3, a4, a5);
Chris@16 600 }
Chris@16 601 };
Chris@16 602
Chris@16 603 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Result>
Chris@16 604 struct function_adaptor<Result (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)> {
Chris@16 605
Chris@16 606 template<class T> struct sig { typedef Result type; };
Chris@16 607 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6>
Chris@16 608 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) {
Chris@16 609 return func(a1, a2, a3, a4, a5, a6);
Chris@16 610 }
Chris@16 611 };
Chris@16 612
Chris@16 613 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Result>
Chris@16 614 struct function_adaptor<Result (*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)> {
Chris@16 615
Chris@16 616 template<class T> struct sig { typedef Result type; };
Chris@16 617 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6>
Chris@16 618 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) {
Chris@16 619 return func(a1, a2, a3, a4, a5, a6);
Chris@16 620 }
Chris@16 621 };
Chris@16 622
Chris@16 623
Chris@16 624 // -- function adaptors with 8 argument apply
Chris@16 625 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Result>
Chris@16 626 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) const> {
Chris@16 627
Chris@16 628 template<class T> struct sig { typedef Result type; };
Chris@16 629 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6>
Chris@16 630 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) const, const Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) {
Chris@16 631 return (o->*func)(a1, a2, a3, a4, a5, a6);
Chris@16 632 }
Chris@16 633 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6>
Chris@16 634 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) const, const Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) {
Chris@16 635 return (o.*func)(a1, a2, a3, a4, a5, a6);
Chris@16 636 }
Chris@16 637 };
Chris@16 638
Chris@16 639 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Result>
Chris@16 640 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)> {
Chris@16 641
Chris@16 642 template<class T> struct sig { typedef Result type; };
Chris@16 643 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6>
Chris@16 644 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6), Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) {
Chris@16 645 return (o->*func)(a1, a2, a3, a4, a5, a6);
Chris@16 646 }
Chris@16 647 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6>
Chris@16 648 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6), Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) {
Chris@16 649 return (o.*func)(a1, a2, a3, a4, a5, a6);
Chris@16 650 }
Chris@16 651 };
Chris@16 652
Chris@16 653 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Result>
Chris@16 654 struct function_adaptor<Result (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7)> {
Chris@16 655
Chris@16 656 template<class T> struct sig { typedef Result type; };
Chris@16 657 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
Chris@16 658 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) {
Chris@16 659 return func(a1, a2, a3, a4, a5, a6, a7);
Chris@16 660 }
Chris@16 661 };
Chris@16 662
Chris@16 663 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Result>
Chris@16 664 struct function_adaptor<Result (*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7)> {
Chris@16 665
Chris@16 666 template<class T> struct sig { typedef Result type; };
Chris@16 667 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
Chris@16 668 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) {
Chris@16 669 return func(a1, a2, a3, a4, a5, a6, a7);
Chris@16 670 }
Chris@16 671 };
Chris@16 672
Chris@16 673
Chris@16 674 // -- function adaptors with 9 argument apply
Chris@16 675 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Result>
Chris@16 676 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) const> {
Chris@16 677
Chris@16 678 template<class T> struct sig { typedef Result type; };
Chris@16 679 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
Chris@16 680 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) const, const Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) {
Chris@16 681 return (o->*func)(a1, a2, a3, a4, a5, a6, a7);
Chris@16 682 }
Chris@16 683 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
Chris@16 684 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) const, const Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) {
Chris@16 685 return (o.*func)(a1, a2, a3, a4, a5, a6, a7);
Chris@16 686 }
Chris@16 687 };
Chris@16 688
Chris@16 689 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Result>
Chris@16 690 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7)> {
Chris@16 691
Chris@16 692 template<class T> struct sig { typedef Result type; };
Chris@16 693 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
Chris@16 694 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7), Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) {
Chris@16 695 return (o->*func)(a1, a2, a3, a4, a5, a6, a7);
Chris@16 696 }
Chris@16 697 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
Chris@16 698 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7), Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) {
Chris@16 699 return (o.*func)(a1, a2, a3, a4, a5, a6, a7);
Chris@16 700 }
Chris@16 701 };
Chris@16 702
Chris@16 703 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Result>
Chris@16 704 struct function_adaptor<Result (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8)> {
Chris@16 705
Chris@16 706 template<class T> struct sig { typedef Result type; };
Chris@16 707 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
Chris@16 708 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) {
Chris@16 709 return func(a1, a2, a3, a4, a5, a6, a7, a8);
Chris@16 710 }
Chris@16 711 };
Chris@16 712
Chris@16 713 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Result>
Chris@16 714 struct function_adaptor<Result (*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8)> {
Chris@16 715
Chris@16 716 template<class T> struct sig { typedef Result type; };
Chris@16 717 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
Chris@16 718 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) {
Chris@16 719 return func(a1, a2, a3, a4, a5, a6, a7, a8);
Chris@16 720 }
Chris@16 721 };
Chris@16 722
Chris@16 723
Chris@16 724 // -- function adaptors with 10 argument apply
Chris@16 725 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Result>
Chris@16 726 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8) const> {
Chris@16 727
Chris@16 728 template<class T> struct sig { typedef Result type; };
Chris@16 729 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
Chris@16 730 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8) const, const Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) {
Chris@16 731 return (o->*func)(a1, a2, a3, a4, a5, a6, a7, a8);
Chris@16 732 }
Chris@16 733 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
Chris@16 734 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8) const, const Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) {
Chris@16 735 return (o.*func)(a1, a2, a3, a4, a5, a6, a7, a8);
Chris@16 736 }
Chris@16 737 };
Chris@16 738
Chris@16 739 template <class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Result>
Chris@16 740 struct function_adaptor<Result (Object::*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8)> {
Chris@16 741
Chris@16 742 template<class T> struct sig { typedef Result type; };
Chris@16 743 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
Chris@16 744 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8), Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) {
Chris@16 745 return (o->*func)(a1, a2, a3, a4, a5, a6, a7, a8);
Chris@16 746 }
Chris@16 747 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
Chris@16 748 static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8), Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) {
Chris@16 749 return (o.*func)(a1, a2, a3, a4, a5, a6, a7, a8);
Chris@16 750 }
Chris@16 751 };
Chris@16 752
Chris@16 753 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Arg9, class Result>
Chris@16 754 struct function_adaptor<Result (Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9)> {
Chris@16 755
Chris@16 756 template<class T> struct sig { typedef Result type; };
Chris@16 757 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
Chris@16 758 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9) {
Chris@16 759 return func(a1, a2, a3, a4, a5, a6, a7, a8, a9);
Chris@16 760 }
Chris@16 761 };
Chris@16 762
Chris@16 763 template <class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Arg9, class Result>
Chris@16 764 struct function_adaptor<Result (*)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9)> {
Chris@16 765
Chris@16 766 template<class T> struct sig { typedef Result type; };
Chris@16 767 template <class RET, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
Chris@16 768 static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9) {
Chris@16 769 return func(a1, a2, a3, a4, a5, a6, a7, a8, a9);
Chris@16 770 }
Chris@16 771 };
Chris@16 772
Chris@16 773 } // namespace lambda
Chris@16 774 } // namespace boost
Chris@16 775
Chris@16 776 #endif
Chris@16 777
Chris@16 778
Chris@16 779
Chris@16 780
Chris@16 781
Chris@16 782
Chris@16 783
Chris@16 784
Chris@16 785
Chris@16 786
Chris@16 787
Chris@16 788
Chris@16 789