|
75 | 75 | // } |
76 | 76 | //.. |
77 | 77 | // |
78 | | -// NOTE: the need to support cpp03 for Solaris makes it impossible to call |
79 | | -// `createInplace` with classes that expect non-const references in |
80 | | -// constructor arguments. This is due to cpp03 compatibility code |
81 | | -// passing arguments as (const &) when perfect forwarding with `&&` |
82 | | -// is not available. |
| 78 | +// NOTE: In C++03, the forwarding macros used below pass arguments as |
| 79 | +// (const &) because perfect forwarding with `&&` is not available. |
| 80 | +// This makes it impossible to call `createInplace` with classes that |
| 81 | +// expect non-const references in constructor arguments. |
83 | 82 | // Consider passing output arguments with equivalent code using pointers |
84 | 83 | // to mutable variables instead. |
85 | 84 | // |
86 | 85 |
|
87 | 86 | // BDE |
88 | 87 | #include <bsl_functional.h> |
89 | | -#include <bsl_utility.h> // bsl::forward |
90 | 88 | #include <bsl_vector.h> |
91 | 89 | #include <bslmf_isaccessiblebaseof.h> |
92 | 90 | #include <bsls_assert.h> |
93 | 91 | #include <bsls_compilerfeatures.h> |
94 | 92 |
|
95 | | -#if BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES |
96 | | -// Include version that can be compiled with C++03 |
97 | | -// Generated on Wed Jun 18 14:44:06 2025 |
98 | | -// Command line: sim_cpp11_features.pl bmqu_managedcallback.h |
99 | | -# define COMPILING_BMQU_MANAGEDCALLBACK_H |
100 | | -# include <bmqu_managedcallback_cpp03.h> |
101 | | -#undef COMPILING_BMQU_MANAGEDCALLBACK_H |
102 | | -#else |
103 | | - |
104 | 93 | namespace BloombergLP { |
105 | 94 | namespace bmqu { |
106 | 95 |
|
@@ -152,14 +141,60 @@ class ManagedCallback BSLS_KEYWORD_FINAL { |
152 | 141 | /// call a destructor for it and set this object empty. |
153 | 142 | void reset(); |
154 | 143 |
|
155 | | -#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES // $var-args=9 |
156 | 144 | /// Construct a callback object of the specified CALLBACK_TYPE in this |
157 | 145 | /// objects' reusable buffer, with the specified `args` passed to its |
158 | 146 | /// constructor. The buffer must be empty before construction, it is |
159 | 147 | /// the user's responsibility to call `reset()` to destroy the callback. |
160 | | - template <class CALLBACK_TYPE, class... ARGS> |
161 | | - void createInplace(ARGS&&... args); |
162 | | -#endif |
| 148 | + template <class CALLBACK_TYPE> |
| 149 | + void createInplace(); |
| 150 | + |
| 151 | + template <class CALLBACK_TYPE, class ARGS_1> |
| 152 | + void createInplace(BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_1) args_1); |
| 153 | + |
| 154 | + template <class CALLBACK_TYPE, class ARGS_1, class ARGS_2> |
| 155 | + void createInplace(BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_1) args_1, |
| 156 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_2) args_2); |
| 157 | + |
| 158 | + template <class CALLBACK_TYPE, class ARGS_1, class ARGS_2, class ARGS_3> |
| 159 | + void createInplace(BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_1) args_1, |
| 160 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_2) args_2, |
| 161 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_3) args_3); |
| 162 | + |
| 163 | + template <class CALLBACK_TYPE, |
| 164 | + class ARGS_1, |
| 165 | + class ARGS_2, |
| 166 | + class ARGS_3, |
| 167 | + class ARGS_4> |
| 168 | + void createInplace(BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_1) args_1, |
| 169 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_2) args_2, |
| 170 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_3) args_3, |
| 171 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_4) args_4); |
| 172 | + |
| 173 | + template <class CALLBACK_TYPE, |
| 174 | + class ARGS_1, |
| 175 | + class ARGS_2, |
| 176 | + class ARGS_3, |
| 177 | + class ARGS_4, |
| 178 | + class ARGS_5> |
| 179 | + void createInplace(BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_1) args_1, |
| 180 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_2) args_2, |
| 181 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_3) args_3, |
| 182 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_4) args_4, |
| 183 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_5) args_5); |
| 184 | + |
| 185 | + template <class CALLBACK_TYPE, |
| 186 | + class ARGS_1, |
| 187 | + class ARGS_2, |
| 188 | + class ARGS_3, |
| 189 | + class ARGS_4, |
| 190 | + class ARGS_5, |
| 191 | + class ARGS_6> |
| 192 | + void createInplace(BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_1) args_1, |
| 193 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_2) args_2, |
| 194 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_3) args_3, |
| 195 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_4) args_4, |
| 196 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_5) args_5, |
| 197 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_6) args_6); |
163 | 198 |
|
164 | 199 | /// Store the specified `callback` in this object. |
165 | 200 | /// Note: these setters are slow because they performs function copy, going |
@@ -266,19 +301,107 @@ inline void ManagedCallback::operator()() const |
266 | 301 | (*reinterpret_cast<const CallbackFunctor*>(d_callbackBuffer.data()))(); |
267 | 302 | } |
268 | 303 |
|
269 | | -#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES // $var-args=9 |
270 | | -template <class CALLBACK_TYPE, class... ARGS> |
271 | | -inline void ManagedCallback::createInplace(ARGS&&... args) |
| 304 | +template <class CALLBACK_TYPE> |
| 305 | +inline void ManagedCallback::createInplace() |
272 | 306 | { |
273 | | - // Preconditions for placement are checked in `place()`. |
274 | | - // Destructor for the built object will be called in `reset()`. |
275 | | - new (place<CALLBACK_TYPE>()) CALLBACK_TYPE(bsl::forward<ARGS>(args)...); |
| 307 | + new (place<CALLBACK_TYPE>()) CALLBACK_TYPE(); |
| 308 | +} |
| 309 | + |
| 310 | +template <class CALLBACK_TYPE, class ARGS_1> |
| 311 | +inline void |
| 312 | +ManagedCallback::createInplace(BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_1) |
| 313 | + args_1) |
| 314 | +{ |
| 315 | + new (place<CALLBACK_TYPE>()) |
| 316 | + CALLBACK_TYPE(BSLS_COMPILERFEATURES_FORWARD(ARGS_1, args_1)); |
| 317 | +} |
| 318 | + |
| 319 | +template <class CALLBACK_TYPE, class ARGS_1, class ARGS_2> |
| 320 | +inline void ManagedCallback::createInplace( |
| 321 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_1) args_1, |
| 322 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_2) args_2) |
| 323 | +{ |
| 324 | + new (place<CALLBACK_TYPE>()) |
| 325 | + CALLBACK_TYPE(BSLS_COMPILERFEATURES_FORWARD(ARGS_1, args_1), |
| 326 | + BSLS_COMPILERFEATURES_FORWARD(ARGS_2, args_2)); |
| 327 | +} |
| 328 | + |
| 329 | +template <class CALLBACK_TYPE, class ARGS_1, class ARGS_2, class ARGS_3> |
| 330 | +inline void ManagedCallback::createInplace( |
| 331 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_1) args_1, |
| 332 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_2) args_2, |
| 333 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_3) args_3) |
| 334 | +{ |
| 335 | + new (place<CALLBACK_TYPE>()) |
| 336 | + CALLBACK_TYPE(BSLS_COMPILERFEATURES_FORWARD(ARGS_1, args_1), |
| 337 | + BSLS_COMPILERFEATURES_FORWARD(ARGS_2, args_2), |
| 338 | + BSLS_COMPILERFEATURES_FORWARD(ARGS_3, args_3)); |
| 339 | +} |
| 340 | + |
| 341 | +template <class CALLBACK_TYPE, |
| 342 | + class ARGS_1, |
| 343 | + class ARGS_2, |
| 344 | + class ARGS_3, |
| 345 | + class ARGS_4> |
| 346 | +inline void ManagedCallback::createInplace( |
| 347 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_1) args_1, |
| 348 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_2) args_2, |
| 349 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_3) args_3, |
| 350 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_4) args_4) |
| 351 | +{ |
| 352 | + new (place<CALLBACK_TYPE>()) |
| 353 | + CALLBACK_TYPE(BSLS_COMPILERFEATURES_FORWARD(ARGS_1, args_1), |
| 354 | + BSLS_COMPILERFEATURES_FORWARD(ARGS_2, args_2), |
| 355 | + BSLS_COMPILERFEATURES_FORWARD(ARGS_3, args_3), |
| 356 | + BSLS_COMPILERFEATURES_FORWARD(ARGS_4, args_4)); |
| 357 | +} |
| 358 | + |
| 359 | +template <class CALLBACK_TYPE, |
| 360 | + class ARGS_1, |
| 361 | + class ARGS_2, |
| 362 | + class ARGS_3, |
| 363 | + class ARGS_4, |
| 364 | + class ARGS_5> |
| 365 | +inline void ManagedCallback::createInplace( |
| 366 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_1) args_1, |
| 367 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_2) args_2, |
| 368 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_3) args_3, |
| 369 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_4) args_4, |
| 370 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_5) args_5) |
| 371 | +{ |
| 372 | + new (place<CALLBACK_TYPE>()) |
| 373 | + CALLBACK_TYPE(BSLS_COMPILERFEATURES_FORWARD(ARGS_1, args_1), |
| 374 | + BSLS_COMPILERFEATURES_FORWARD(ARGS_2, args_2), |
| 375 | + BSLS_COMPILERFEATURES_FORWARD(ARGS_3, args_3), |
| 376 | + BSLS_COMPILERFEATURES_FORWARD(ARGS_4, args_4), |
| 377 | + BSLS_COMPILERFEATURES_FORWARD(ARGS_5, args_5)); |
| 378 | +} |
| 379 | + |
| 380 | +template <class CALLBACK_TYPE, |
| 381 | + class ARGS_1, |
| 382 | + class ARGS_2, |
| 383 | + class ARGS_3, |
| 384 | + class ARGS_4, |
| 385 | + class ARGS_5, |
| 386 | + class ARGS_6> |
| 387 | +inline void ManagedCallback::createInplace( |
| 388 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_1) args_1, |
| 389 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_2) args_2, |
| 390 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_3) args_3, |
| 391 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_4) args_4, |
| 392 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_5) args_5, |
| 393 | + BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_6) args_6) |
| 394 | +{ |
| 395 | + new (place<CALLBACK_TYPE>()) |
| 396 | + CALLBACK_TYPE(BSLS_COMPILERFEATURES_FORWARD(ARGS_1, args_1), |
| 397 | + BSLS_COMPILERFEATURES_FORWARD(ARGS_2, args_2), |
| 398 | + BSLS_COMPILERFEATURES_FORWARD(ARGS_3, args_3), |
| 399 | + BSLS_COMPILERFEATURES_FORWARD(ARGS_4, args_4), |
| 400 | + BSLS_COMPILERFEATURES_FORWARD(ARGS_5, args_5), |
| 401 | + BSLS_COMPILERFEATURES_FORWARD(ARGS_6, args_6)); |
276 | 402 | } |
277 | | -#endif |
278 | 403 |
|
279 | 404 | } // close package namespace |
280 | 405 | } // close enterprise namespace |
281 | 406 |
|
282 | | -#endif // End C++11 code |
283 | | - |
284 | 407 | #endif |
0 commit comments