Skip to content

Commit 1b94fc2

Browse files
authored
Refactor[bmqu::ManagedCallback]: explicit variadic createInplace (#1555)
Remove the last cpp03 autogenerated files. Signed-off-by: Evgeny Malygin <emalygin@bloomberg.net>
1 parent fcdacb2 commit 1b94fc2

7 files changed

Lines changed: 160 additions & 707 deletions

File tree

.gitattributes

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,9 @@
11
src/applications/bmqtool/m_bmqtool_messages.cpp linguist-generated=true
22
src/applications/bmqtool/m_bmqtool_messages.h linguist-generated=true
3-
src/groups/bmq/bmqex/bmqex_bindutil_cpp03.cpp linguist-generated=true
4-
src/groups/bmq/bmqex/bmqex_bindutil_cpp03.h linguist-generated=true
53
src/groups/bmq/bmqp/bmqp_ctrlmsg_messages.cpp linguist-generated=true
64
src/groups/bmq/bmqp/bmqp_ctrlmsg_messages.h linguist-generated=true
75
src/groups/bmq/bmqstm/bmqstm_values.cpp linguist-generated=true
86
src/groups/bmq/bmqstm/bmqstm_values.h linguist-generated=true
9-
src/groups/bmq/bmqu/bmqu_managedcallback_cpp03.cpp linguist-generated=true
10-
src/groups/bmq/bmqu/bmqu_managedcallback_cpp03.h linguist-generated=true
11-
src/groups/bmq/bmqu/bmqu_objectplaceholder_cpp03.cpp linguist-generated=true
12-
src/groups/bmq/bmqu/bmqu_objectplaceholder_cpp03.h linguist-generated=true
13-
src/groups/bmq/bmqu/bmqu_operationchain_cpp03.cpp linguist-generated=true
14-
src/groups/bmq/bmqu/bmqu_operationchain_cpp03.h linguist-generated=true
157
src/groups/mqb/mqbcfg/mqbcfg_messages.cpp linguist-generated=true
168
src/groups/mqb/mqbcfg/mqbcfg_messages.h linguist-generated=true
179
src/groups/mqb/mqbcmd/mqbcmd_messages.cpp linguist-generated=true

bin/skip-cpp03-in-workspace.sh

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/groups/bmq/bmqu/bmqu_managedcallback.h

Lines changed: 151 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -75,32 +75,21 @@
7575
// }
7676
//..
7777
//
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.
8382
// Consider passing output arguments with equivalent code using pointers
8483
// to mutable variables instead.
8584
//
8685

8786
// BDE
8887
#include <bsl_functional.h>
89-
#include <bsl_utility.h> // bsl::forward
9088
#include <bsl_vector.h>
9189
#include <bslmf_isaccessiblebaseof.h>
9290
#include <bsls_assert.h>
9391
#include <bsls_compilerfeatures.h>
9492

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-
10493
namespace BloombergLP {
10594
namespace bmqu {
10695

@@ -152,14 +141,60 @@ class ManagedCallback BSLS_KEYWORD_FINAL {
152141
/// call a destructor for it and set this object empty.
153142
void reset();
154143

155-
#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES // $var-args=9
156144
/// Construct a callback object of the specified CALLBACK_TYPE in this
157145
/// objects' reusable buffer, with the specified `args` passed to its
158146
/// constructor. The buffer must be empty before construction, it is
159147
/// 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);
163198

164199
/// Store the specified `callback` in this object.
165200
/// Note: these setters are slow because they performs function copy, going
@@ -266,19 +301,107 @@ inline void ManagedCallback::operator()() const
266301
(*reinterpret_cast<const CallbackFunctor*>(d_callbackBuffer.data()))();
267302
}
268303

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()
272306
{
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));
276402
}
277-
#endif
278403

279404
} // close package namespace
280405
} // close enterprise namespace
281406

282-
#endif // End C++11 code
283-
284407
#endif

src/groups/bmq/bmqu/bmqu_managedcallback.t.cpp

Lines changed: 9 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,7 @@ void complexFunction(size_t* calls,
8181
BSLA_MAYBE_UNUSED bsls::Types::Uint64 arg2,
8282
BSLA_MAYBE_UNUSED bsls::Types::Uint64 arg3,
8383
BSLA_MAYBE_UNUSED bsls::Types::Uint64 arg4,
84-
BSLA_MAYBE_UNUSED bsls::Types::Uint64 arg5,
85-
BSLA_MAYBE_UNUSED bsls::Types::Uint64 arg6,
86-
BSLA_MAYBE_UNUSED bsls::Types::Uint64 arg7,
87-
BSLA_MAYBE_UNUSED bsls::Types::Uint64 arg8)
84+
BSLA_MAYBE_UNUSED bsls::Types::Uint64 arg5)
8885
{
8986
++(*calls);
9087
}
@@ -96,28 +93,19 @@ struct ComplexCallback : bmqu::ManagedCallback::CallbackFunctor {
9693
bsls::Types::Uint64 d_arg3;
9794
bsls::Types::Uint64 d_arg4;
9895
bsls::Types::Uint64 d_arg5;
99-
bsls::Types::Uint64 d_arg6;
100-
bsls::Types::Uint64 d_arg7;
101-
bsls::Types::Uint64 d_arg8;
10296

10397
explicit ComplexCallback(size_t* calls,
10498
bsls::Types::Uint64 arg1,
10599
bsls::Types::Uint64 arg2,
106100
bsls::Types::Uint64 arg3,
107101
bsls::Types::Uint64 arg4,
108-
bsls::Types::Uint64 arg5,
109-
bsls::Types::Uint64 arg6,
110-
bsls::Types::Uint64 arg7,
111-
bsls::Types::Uint64 arg8)
102+
bsls::Types::Uint64 arg5)
112103
: d_calls_p(calls)
113104
, d_arg1(arg1)
114105
, d_arg2(arg2)
115106
, d_arg3(arg3)
116107
, d_arg4(arg4)
117108
, d_arg5(arg5)
118-
, d_arg6(arg6)
119-
, d_arg7(arg7)
120-
, d_arg8(arg8)
121109
{
122110
BSLS_ASSERT_SAFE(calls);
123111
}
@@ -257,7 +245,7 @@ static void test1_ManagedCallback()
257245
bmqtst::TestHelper::printTestName("MANAGED CALLBACK");
258246

259247
bsl::vector<bsls::Types::Uint64> args(bmqtst::TestHelperUtil::allocator());
260-
args.resize(8, 0);
248+
args.resize(5, 0);
261249

262250
bmqu::ManagedCallback callback(bmqtst::TestHelperUtil::allocator());
263251
BMQTST_ASSERT(callback.empty());
@@ -318,10 +306,7 @@ static void test1_ManagedCallback()
318306
args[1],
319307
args[2],
320308
args[3],
321-
args[4],
322-
args[5],
323-
args[6],
324-
args[7]);
309+
args[4]);
325310
BMQTST_ASSERT(!callback.empty());
326311

327312
callback();
@@ -345,10 +330,7 @@ static void test1_ManagedCallback()
345330
args[1],
346331
args[2],
347332
args[3],
348-
args[4],
349-
args[5],
350-
args[6],
351-
args[7]);
333+
args[4]);
352334
}
353335
BMQTST_ASSERT(!callback.empty());
354336

@@ -379,7 +361,7 @@ static void testN1_ManagedCallbackPerformance()
379361
// `calls` is used everywhere to prevent optimizing out anything.
380362
size_t calls = 0;
381363
bsl::vector<bsls::Types::Uint64> args(bmqtst::TestHelperUtil::allocator());
382-
args.resize(8, 0);
364+
args.resize(5, 0);
383365

384366
// Warmup
385367
for (size_t i = 0; i < k_ITERS_NUM; i++) {
@@ -565,10 +547,7 @@ static void testN1_ManagedCallbackPerformance()
565547
args[1],
566548
args[2],
567549
args[3],
568-
args[4],
569-
args[5],
570-
args[6],
571-
args[7]);
550+
args[4]);
572551
callback();
573552
}
574553
const bsls::Types::Int64 end = bsls::TimeUtil::getTimer();
@@ -585,10 +564,7 @@ static void testN1_ManagedCallbackPerformance()
585564
args[1],
586565
args[2],
587566
args[3],
588-
args[4],
589-
args[5],
590-
args[6],
591-
args[7]);
567+
args[4]);
592568
callback();
593569
callback.reset();
594570
}
@@ -608,10 +584,7 @@ static void testN1_ManagedCallbackPerformance()
608584
args[1],
609585
args[2],
610586
args[3],
611-
args[4],
612-
args[5],
613-
args[6],
614-
args[7]);
587+
args[4]);
615588
callback();
616589
callback.reset();
617590
}

0 commit comments

Comments
 (0)