GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: include/dynamic-graph/command-bind.h Lines: 104 109 95.4 %
Date: 2023-03-15 12:04:10 Branches: 157 326 48.2 %

Line Branch Exec Source
1
//
2
// Copyright 2010 CNRS
3
//
4
// Author: Nicolas Mansard
5
//
6
7
#ifndef __dg_command_bind_h__
8
#define __dg_command_bind_h__
9
10
/* Create a command from a bind directly. Examples are:
11
12
 *    addCommand("myProcVoid",
13
 *               makeCommandVoid0(*this,&ClassName::functionNoArg,
14
 *                                docCommandVoid0("Simple line doc here.")));
15
16
 *    addCommand("myProcOneString",
17
 *               makeCommandVoid1(*this,&EntityName::functionOneStringArg,
18
 *                                docCommandVoid1("Simple line doc here.",
19
 *                                                "string")));
20
 *
21
 */
22
23
#include <boost/assign/list_of.hpp>
24
#include <boost/bind.hpp>
25
#include <boost/function.hpp>
26
27
#include "dynamic-graph/command.h"
28
29
/* --- FUNCTION 0 ARGS ----------------------------------------------------- */
30
namespace dynamicgraph {
31
namespace command {
32
33
template <class E>
34
struct CommandVoid0 : public Command {
35
12
  CommandVoid0(E &entity, boost::function<void(void)> function,
36
               const std::string &docString)
37
12
      : Command(entity, EMPTY_ARG, docString), fptr(function) {}
38
39
 protected:
40
3
  virtual Value doExecute() {
41
3
    assert(getParameterValues().size() == 0);
42
3
    fptr();
43
3
    return Value();  // void
44
  }
45
46
 private:
47
  boost::function<void(void)> fptr;
48
};
49
50
template <class E>
51
CommandVoid0<E> *makeCommandVoid0(E &entity,
52
                                  boost::function<void(void)> function,
53
                                  const std::string &docString) {
54
  return new CommandVoid0<E>(entity, function, docString);
55
}
56
57
template <class E>
58
CommandVoid0<E> *makeCommandVoid0(E &entity,
59
                                  boost::function<void(E *)> function,
60
                                  const std::string &docString) {
61
  return new CommandVoid0<E>(entity, boost::bind(function, &entity), docString);
62
}
63
64
template <class E>
65
12
CommandVoid0<E> *makeCommandVoid0(E &entity, void (E::*function)(void),
66
                                  const std::string &docString) {
67

12
  return new CommandVoid0<E>(entity, boost::bind(function, &entity), docString);
68
}
69
70
12
inline std::string docCommandVoid0(const std::string &doc) {
71

24
  return std::string("\n") + doc + "\n\nNo input.\nVoid return.\n\n";
72
}
73
74
}  // namespace command
75
}  // namespace dynamicgraph
76
77
/* --- FUNCTION 1 ARGS ------------------------------------------------------ */
78
namespace dynamicgraph {
79
namespace command {
80
81
template <class E, typename T>
82
struct CommandVoid1 : public Command {
83
  typedef boost::function<void(const T &)> function_t;
84
85
1
  CommandVoid1(E &entity, function_t function, const std::string &docString)
86
      : Command(entity, boost::assign::list_of(ValueHelper<T>::TypeID),
87
                docString),
88

1
        fptr(function) {}
89
90
 protected:
91
1
  virtual Value doExecute() {
92

1
    assert(getParameterValues().size() == 1);
93

1
    T val = getParameterValues()[0].value();
94
1
    fptr(val);
95
2
    return Value();  // void
96
  }
97
98
 private:
99
  function_t fptr;
100
};
101
102
template <class E, typename T>
103
CommandVoid1<E, T> *makeCommandVoid1(
104
    E &entity, boost::function<void(const T &)> function,
105
    // typename CommandVoid1<E,T>::function_t function ,
106
    const std::string &docString) {
107
  return new CommandVoid1<E, T>(entity, function, docString);
108
}
109
110
template <class E, typename T>
111
CommandVoid1<E, T> *makeCommandVoid1(
112
    E &entity,
113
    // The following syntaxt don't compile when not specializing
114
    // the template arg... why ???
115
    boost::function<void(E *, const T &)> function,
116
    const std::string &docString) {
117
  return new CommandVoid1<E, T>(entity, boost::bind(function, &entity, _1),
118
                                docString);
119
}
120
121
template <class E, typename T>
122
1
CommandVoid1<E, T> *makeCommandVoid1(E &entity, void (E::*function)(const T &),
123
                                     const std::string &docString) {
124
1
  return new CommandVoid1<E, T>(entity, boost::bind(function, &entity, _1),
125
2
                                docString);
126
  return NULL;
127
}
128
129
2
inline std::string docCommandVoid1(const std::string &doc,
130
                                   const std::string &type) {
131


4
  return std::string("\n") + doc + "\n\nInput:\n - A " + type +
132
4
         ".\nVoid return.\n\n";
133
}
134
135
}  // namespace command
136
}  // namespace dynamicgraph
137
138
/* --- FUNCTION 2 ARGS ------------------------------------------------------ */
139
namespace dynamicgraph {
140
namespace command {
141
142
template <class E, typename T1, typename T2>
143
struct CommandVoid2 : public Command {
144
  typedef boost::function<void(const T1 &, const T2 &)> function_t;
145
146
3
  CommandVoid2(E &entity, function_t function, const std::string &docString)
147
      : Command(entity,
148
3
                boost::assign::list_of(ValueHelper<T1>::TypeID)(
149
                    ValueHelper<T2>::TypeID),
150
                docString),
151

6
        fptr(function) {}
152
153
 protected:
154
1
  virtual Value doExecute() {
155

1
    assert(getParameterValues().size() == 2);
156

1
    T1 val1 = getParameterValues()[0].value();
157

1
    T2 val2 = getParameterValues()[1].value();
158
1
    fptr(val1, val2);
159
2
    return Value();  // void
160
  }
161
162
 private:
163
  function_t fptr;
164
};
165
166
template <class E, typename T1, typename T2>
167
CommandVoid2<E, T1, T2> *makeCommandVoid2(
168
    E &entity, boost::function<void(const T1 &, const T2 &)> function,
169
    const std::string &docString) {
170
  return new CommandVoid2<E, T1, T2>(entity, function, docString);
171
}
172
173
template <class E, typename T1, typename T2>
174
CommandVoid2<E, T1, T2> *makeCommandVoid2(
175
    E &entity,
176
    // The following syntaxt don't compile when not specializing
177
    // the template arg... why ???
178
    boost::function<void(E *, const T1 &, const T2 &)> function,
179
    const std::string &docString) {
180
  return new CommandVoid2<E, T1, T2>(
181
      entity, boost::bind(function, &entity, _1, _2), docString);
182
}
183
184
template <class E, typename T1, typename T2>
185
3
CommandVoid2<E, T1, T2> *makeCommandVoid2(E &entity,
186
                                          void (E::*function)(const T1 &,
187
                                                              const T2 &),
188
                                          const std::string &docString) {
189
3
  return new CommandVoid2<E, T1, T2>(
190
6
      entity, boost::bind(function, &entity, _1, _2), docString);
191
  return NULL;
192
}
193
194
4
inline std::string docCommandVoid2(const std::string &doc,
195
                                   const std::string &type1,
196
                                   const std::string &type2) {
197



8
  return (std::string("\n") + doc + "\n\n" + "Input:\n - A " + type1 + ".\n" +
198

12
          "Input:\n - A " + type2 + ".\n" + "Void return.\n\n");
199
}
200
201
}  // namespace command
202
}  // namespace dynamicgraph
203
204
/* --- FUNCTION 3 ARGS ------------------------------------------------------ */
205
namespace dynamicgraph {
206
namespace command {
207
208
template <class E, typename T1, typename T2, typename T3>
209
struct CommandVoid3 : public Command {
210
  typedef boost::function<void(const T1 &, const T2 &, const T3 &)> function_t;
211
212
3
  CommandVoid3(E &entity, function_t function, const std::string &docString)
213
      : Command(entity,
214
3
                boost::assign::list_of(ValueHelper<T1>::TypeID)(
215
3
                    ValueHelper<T2>::TypeID)(ValueHelper<T3>::TypeID),
216
                docString),
217

6
        fptr(function) {}
218
219
 protected:
220
1
  virtual Value doExecute() {
221

1
    assert(getParameterValues().size() == 3);
222

1
    T1 val1 = getParameterValues()[0].value();
223

1
    T2 val2 = getParameterValues()[1].value();
224

1
    T3 val3 = getParameterValues()[2].value();
225
1
    fptr(val1, val2, val3);
226
2
    return Value();  // void
227
  }
228
229
 private:
230
  function_t fptr;
231
};
232
233
template <class E, typename T1, typename T2, typename T3>
234
CommandVoid3<E, T1, T2, T3> *makeCommandVoid3(
235
    E &entity, typename CommandVoid3<E, T1, T2, T3>::function_t function,
236
    const std::string &docString) {
237
  return new CommandVoid3<E, T1, T2, T3>(entity, function, docString);
238
}
239
240
template <class E, typename T1, typename T2, typename T3>
241
CommandVoid3<E, T1, T2, T3> *makeCommandVoid3(
242
    E &entity,
243
    // The following syntaxt don't compile when not specializing the template
244
    // arg... why ???
245
    boost::function<void(E *, const T1 &, const T2 &, const T3 &)> function,
246
    const std::string &docString) {
247
  return new CommandVoid3<E, T1, T2, T3>(
248
      entity, boost::bind(function, &entity, _1, _2, _3), docString);
249
}
250
251
template <class E, typename T1, typename T2, typename T3>
252
3
CommandVoid3<E, T1, T2, T3> *makeCommandVoid3(
253
    E &entity, void (E::*function)(const T1 &, const T2 &, const T3 &),
254
    const std::string &docString) {
255
3
  return new CommandVoid3<E, T1, T2, T3>(
256
6
      entity, boost::bind(function, &entity, _1, _2, _3), docString);
257
  return NULL;
258
}
259
260
3
inline std::string docCommandVoid3(const std::string &doc,
261
                                   const std::string &type1,
262
                                   const std::string &type2,
263
                                   const std::string &type3) {
264



6
  return (std::string("\n") + doc + "\n\n" + "Input:\n - A " + type1 + ".\n" +
265


6
          "Input:\n - A " + type2 + ".\n" + "Input:\n - A " + type3 + ".\n" +
266
6
          "Void return.\n\n");
267
}
268
269
}  // namespace command
270
}  // namespace dynamicgraph
271
272
/* --- FUNCTION 4 ARGS ------------------------------------------------------ */
273
namespace dynamicgraph {
274
namespace command {
275
276
template <class E, typename T1, typename T2, typename T3, typename T4>
277
struct CommandVoid4 : public Command {
278
  typedef boost::function<void(const T1 &, const T2 &, const T3 &, const T4 &)>
279
      function_t;
280
  typedef void (E::*memberFunction_ptr_t)(const T1 &, const T2 &, const T3 &,
281
                                          const T4 &);
282
283
1
  CommandVoid4(E &entity, function_t function, const std::string &docString)
284
      : Command(entity,
285
1
                boost::assign::list_of(ValueHelper<T1>::TypeID)(
286

1
                    ValueHelper<T2>::TypeID)(ValueHelper<T3>::TypeID)(
287
                    ValueHelper<T4>::TypeID),
288
                docString),
289

2
        fptr(function) {}
290
291
 protected:
292
1
  virtual Value doExecute() {
293

1
    assert(getParameterValues().size() == 4);
294

1
    T1 val1 = getParameterValues()[0].value();
295

1
    T2 val2 = getParameterValues()[1].value();
296

1
    T3 val3 = getParameterValues()[2].value();
297

1
    T4 val4 = getParameterValues()[3].value();
298
1
    fptr(val1, val2, val3, val4);
299
2
    return Value();  // void
300
  }
301
302
 private:
303
  function_t fptr;
304
};
305
306
template <class E, typename T1, typename T2, typename T3, typename T4>
307
CommandVoid4<E, T1, T2, T3, T4> *makeCommandVoid4(
308
    E &entity, typename CommandVoid4<E, T1, T2, T3, T4>::function_t function,
309
    const std::string &docString) {
310
  return new CommandVoid4<E, T1, T2, T3, T4>(entity, function, docString);
311
}
312
313
template <class E, typename T1, typename T2, typename T3, typename T4>
314
CommandVoid4<E, T1, T2, T3, T4> *makeCommandVoid4(
315
    E &entity,
316
    boost::function<void(E *, const T1 &, const T2 &, const T3 &, const T4 &)>
317
        function,
318
    const std::string &docString) {
319
  return new CommandVoid4<E, T1, T2, T3, T4>(
320
      entity, boost::bind(function, &entity, _1, _2, _3, _4), docString);
321
}
322
323
template <class E, typename T1, typename T2, typename T3, typename T4>
324
1
CommandVoid4<E, T1, T2, T3, T4> *makeCommandVoid4(
325
    E &entity,
326
    void (E::*function)(const T1 &, const T2 &, const T3 &, const T4 &),
327
    const std::string &docString) {
328
1
  return new CommandVoid4<E, T1, T2, T3, T4>(
329
2
      entity, boost::bind(function, &entity, _1, _2, _3, _4), docString);
330
  return NULL;
331
}
332
333
1
inline std::string docCommandVoid4(const std::string &doc,
334
                                   const std::string &type1,
335
                                   const std::string &type2,
336
                                   const std::string &type3,
337
                                   const std::string &type4) {
338



2
  return (std::string("\n") + doc + "\n\n" + "Input:\n - A " + type1 + ".\n" +
339



2
          "Input:\n - A " + type2 + ".\n" + "Input:\n - A " + type3 + ".\n" +
340

3
          "Input:\n - A " + type4 + ".\n" + "Void return.\n\n");
341
}
342
343
}  // namespace command
344
}  // namespace dynamicgraph
345
346
/* --- FUNCTION 5 ARGS ------------------------------------------------------ */
347
namespace dynamicgraph {
348
namespace command {
349
350
template <class E, typename T1, typename T2, typename T3, typename T4,
351
          typename T5>
352
struct CommandVoid5 : public Command {
353
  typedef boost::function<void(const T1 &, const T2 &, const T3 &, const T4 &,
354
                               const T5 &)>
355
      function_t;
356
  typedef void (E::*memberFunction_ptr_t)(const T1 &, const T2 &, const T3 &,
357
                                          const T4 &, const T5 &);
358
359
  CommandVoid5(E &entity, function_t function, const std::string &docString)
360
      : Command(entity,
361
                boost::assign::list_of(ValueHelper<T1>::TypeID)(
362
                    ValueHelper<T2>::TypeID)(ValueHelper<T3>::TypeID)(
363
                    ValueHelper<T4>::TypeID)(ValueHelper<T5>::TypeID),
364
                docString),
365
        fptr(function) {}
366
367
 protected:
368
  virtual Value doExecute() {
369
    assert(getParameterValues().size() == 5);
370
    T1 val1 = getParameterValues()[0].value();
371
    T2 val2 = getParameterValues()[1].value();
372
    T3 val3 = getParameterValues()[2].value();
373
    T4 val4 = getParameterValues()[3].value();
374
    T5 val5 = getParameterValues()[4].value();
375
    fptr(val1, val2, val3, val4, val5);
376
    return Value();  // void
377
  }
378
379
 private:
380
  function_t fptr;
381
};
382
383
template <class E, typename T1, typename T2, typename T3, typename T4,
384
          typename T5>
385
CommandVoid5<E, T1, T2, T3, T4, T5> *makeCommandVoid5(
386
    E &entity,
387
    typename CommandVoid5<E, T1, T2, T3, T4, T5>::function_t function,
388
    const std::string &docString) {
389
  return new CommandVoid5<E, T1, T2, T3, T4, T5>(entity, function, docString);
390
}
391
392
template <class E, typename T1, typename T2, typename T3, typename T4,
393
          typename T5>
394
CommandVoid5<E, T1, T2, T3, T4, T5> *makeCommandVoid5(
395
    E &entity,
396
    boost::function<void(E *, const T1 &, const T2 &, const T3 &, const T4 &,
397
                         const T5 &)>
398
        function,
399
    const std::string &docString) {
400
  return new CommandVoid5<E, T1, T2, T3, T4, T5>(
401
      entity, boost::bind(function, &entity, _1, _2, _3, _4, _5), docString);
402
}
403
404
template <class E, typename T1, typename T2, typename T3, typename T4,
405
          typename T5>
406
CommandVoid5<E, T1, T2, T3, T4, T5> *makeCommandVoid5(
407
    E &entity,
408
    void (E::*function)(const T1 &, const T2 &, const T3 &, const T4 &,
409
                        const T5 &),
410
    const std::string &docString) {
411
  return new CommandVoid5<E, T1, T2, T3, T4, T5>(
412
      entity, boost::bind(function, &entity, _1, _2, _3, _4, _5), docString);
413
  return NULL;
414
}
415
416
inline std::string docCommandVoid5(const std::string &doc,
417
                                   const std::string &type1,
418
                                   const std::string &type2,
419
                                   const std::string &type3,
420
                                   const std::string &type4,
421
                                   const std::string &type5) {
422
  return (std::string("\n") + doc + "\n\n" + "Input:\n - A " + type1 + ".\n" +
423
          "Input:\n - A " + type2 + ".\n" + "Input:\n - A " + type3 + ".\n" +
424
          "Input:\n - A " + type4 + ".\n" + "Input:\n - A " + type5 + ".\n" +
425
          "Void return.\n\n");
426
}
427
428
}  // namespace command
429
}  // namespace dynamicgraph
430
431
/* --- FUNCTION 6 ARGS ------------------------------------------------------ */
432
namespace dynamicgraph {
433
namespace command {
434
435
template <class E, typename T1, typename T2, typename T3, typename T4,
436
          typename T5, typename T6>
437
struct CommandVoid6 : public Command {
438
  typedef boost::function<void(const T1 &, const T2 &, const T3 &, const T4 &,
439
                               const T5 &, const T6 &)>
440
      function_t;
441
  typedef void (E::*memberFunction_ptr_t)(const T1 &, const T2 &, const T3 &,
442
                                          const T4 &, const T5 &, const T6 &);
443
444
  CommandVoid6(E &entity, function_t function, const std::string &docString)
445
      : Command(entity,
446
                boost::assign::list_of(ValueHelper<T1>::TypeID)(
447
                    ValueHelper<T2>::TypeID)(ValueHelper<T3>::TypeID)(
448
                    ValueHelper<T4>::TypeID)(ValueHelper<T5>::TypeID)(
449
                    ValueHelper<T6>::TypeID),
450
                docString),
451
        fptr(function) {}
452
453
 protected:
454
  virtual Value doExecute() {
455
    assert(getParameterValues().size() == 6);
456
    T1 val1 = getParameterValues()[0].value();
457
    T2 val2 = getParameterValues()[1].value();
458
    T3 val3 = getParameterValues()[2].value();
459
    T4 val4 = getParameterValues()[3].value();
460
    T5 val5 = getParameterValues()[4].value();
461
    T6 val6 = getParameterValues()[5].value();
462
    fptr(val1, val2, val3, val4, val5, val6);
463
    return Value();  // void
464
  }
465
466
 private:
467
  function_t fptr;
468
};
469
470
template <class E, typename T1, typename T2, typename T3, typename T4,
471
          typename T5, typename T6>
472
CommandVoid6<E, T1, T2, T3, T4, T5, T6> *makeCommandVoid6(
473
    E &entity,
474
    typename CommandVoid6<E, T1, T2, T3, T4, T5, T6>::function_t function,
475
    const std::string &docString) {
476
  return new CommandVoid6<E, T1, T2, T3, T4, T5, T6>(entity, function,
477
                                                     docString);
478
}
479
480
template <class E, typename T1, typename T2, typename T3, typename T4,
481
          typename T5, typename T6>
482
CommandVoid6<E, T1, T2, T3, T4, T5, T6> *makeCommandVoid6(
483
    E &entity,
484
    boost::function<void(E *, const T1 &, const T2 &, const T3 &, const T4 &,
485
                         const T5 &, const T6 &)>
486
        function,
487
    const std::string &docString) {
488
  return new CommandVoid6<E, T1, T2, T3, T4, T5, T6>(
489
      entity, boost::bind(function, &entity, _1, _2, _3, _4, _5, _6),
490
      docString);
491
}
492
493
template <class E, typename T1, typename T2, typename T3, typename T4,
494
          typename T5, typename T6>
495
CommandVoid6<E, T1, T2, T3, T4, T5, T6> *makeCommandVoid6(
496
    E &entity,
497
    void (E::*function)(const T1 &, const T2 &, const T3 &, const T4 &,
498
                        const T5 &, const T6 &),
499
    const std::string &docString) {
500
  return new CommandVoid6<E, T1, T2, T3, T4, T5, T6>(
501
      entity, boost::bind(function, &entity, _1, _2, _3, _4, _5, _6),
502
      docString);
503
  return NULL;
504
}
505
506
inline std::string docCommandVoid6(
507
    const std::string &doc, const std::string &type1, const std::string &type2,
508
    const std::string &type3, const std::string &type4,
509
    const std::string &type5, const std::string &type6) {
510
  return (std::string("\n") + doc + "\n\n" + "Input:\n - A " + type1 + ".\n" +
511
          "Input:\n - A " + type2 + ".\n" + "Input:\n - A " + type3 + ".\n" +
512
          "Input:\n - A " + type4 + ".\n" + "Input:\n - A " + type5 + ".\n" +
513
          "Input:\n - A " + type6 + ".\n" + "Void return.\n\n");
514
}
515
516
}  // namespace command
517
}  // namespace dynamicgraph
518
519
/* --- FUNCTION 7 ARGS ------------------------------------------------------ */
520
namespace dynamicgraph {
521
namespace command {
522
523
template <class E, typename T1, typename T2, typename T3, typename T4,
524
          typename T5, typename T6, typename T7>
525
struct CommandVoid7 : public Command {
526
  typedef boost::function<void(const T1 &, const T2 &, const T3 &, const T4 &,
527
                               const T5 &, const T6 &, const T7 &)>
528
      function_t;
529
  typedef void (E::*memberFunction_ptr_t)(const T1 &, const T2 &, const T3 &,
530
                                          const T4 &, const T5 &, const T6 &,
531
                                          const T7 &);
532
533
  CommandVoid7(E &entity, function_t function, const std::string &docString)
534
      : Command(entity,
535
                boost::assign::list_of(ValueHelper<T1>::TypeID)(
536
                    ValueHelper<T2>::TypeID)(ValueHelper<T3>::TypeID)(
537
                    ValueHelper<T4>::TypeID)(ValueHelper<T5>::TypeID)(
538
                    ValueHelper<T6>::TypeID)(ValueHelper<T7>::TypeID),
539
                docString),
540
        fptr(function) {}
541
542
 protected:
543
  virtual Value doExecute() {
544
    assert(getParameterValues().size() == 7);
545
    T1 val1 = getParameterValues()[0].value();
546
    T2 val2 = getParameterValues()[1].value();
547
    T3 val3 = getParameterValues()[2].value();
548
    T4 val4 = getParameterValues()[3].value();
549
    T5 val5 = getParameterValues()[4].value();
550
    T6 val6 = getParameterValues()[5].value();
551
    T7 val7 = getParameterValues()[6].value();
552
    fptr(val1, val2, val3, val4, val5, val6, val7);
553
    return Value();  // void
554
  }
555
556
 private:
557
  function_t fptr;
558
};
559
560
template <class E, typename T1, typename T2, typename T3, typename T4,
561
          typename T5, typename T6, typename T7>
562
CommandVoid7<E, T1, T2, T3, T4, T5, T6, T7> *makeCommandVoid7(
563
    E &entity,
564
    typename CommandVoid7<E, T1, T2, T3, T4, T5, T6, T7>::function_t function,
565
    const std::string &docString) {
566
  return new CommandVoid7<E, T1, T2, T3, T4, T5, T6, T7>(entity, function,
567
                                                         docString);
568
}
569
570
template <class E, typename T1, typename T2, typename T3, typename T4,
571
          typename T5, typename T6, typename T7>
572
CommandVoid7<E, T1, T2, T3, T4, T5, T6, T7> *makeCommandVoid7(
573
    E &entity,
574
    boost::function<void(E *, const T1 &, const T2 &, const T3 &, const T4 &,
575
                         const T5 &, const T6 &, const T7 &)>
576
        function,
577
    const std::string &docString) {
578
  return new CommandVoid7<E, T1, T2, T3, T4, T5, T6, T7>(
579
      entity, boost::bind(function, &entity, _1, _2, _3, _4, _5, _6, _7),
580
      docString);
581
}
582
583
template <class E, typename T1, typename T2, typename T3, typename T4,
584
          typename T5, typename T6, typename T7>
585
CommandVoid7<E, T1, T2, T3, T4, T5, T6, T7> *makeCommandVoid7(
586
    E &entity,
587
    void (E::*function)(const T1 &, const T2 &, const T3 &, const T4 &,
588
                        const T5 &, const T6 &, const T7 &),
589
    const std::string &docString) {
590
  return new CommandVoid7<E, T1, T2, T3, T4, T5, T6, T7>(
591
      entity, boost::bind(function, &entity, _1, _2, _3, _4, _5, _6, _7),
592
      docString);
593
  return NULL;
594
}
595
596
inline std::string docCommandVoid7(
597
    const std::string &doc, const std::string &type1, const std::string &type2,
598
    const std::string &type3, const std::string &type4,
599
    const std::string &type5, const std::string &type6,
600
    const std::string &type7) {
601
  return (std::string("\n") + doc + "\n\n" + "Input:\n - A " + type1 + ".\n" +
602
          "Input:\n - A " + type2 + ".\n" + "Input:\n - A " + type3 + ".\n" +
603
          "Input:\n - A " + type4 + ".\n" + "Input:\n - A " + type5 + ".\n" +
604
          "Input:\n - A " + type6 + ".\n" + "Input:\n - A " + type7 + ".\n" +
605
          "Void return.\n\n");
606
}
607
608
}  // namespace command
609
}  // namespace dynamicgraph
610
611
/* --- FUNCTION 8 ARGS ------------------------------------------------------ */
612
namespace dynamicgraph {
613
namespace command {
614
615
template <class E, typename T1, typename T2, typename T3, typename T4,
616
          typename T5, typename T6, typename T7, typename T8>
617
struct CommandVoid8 : public Command {
618
  typedef boost::function<void(const T1 &, const T2 &, const T3 &, const T4 &,
619
                               const T5 &, const T6 &, const T7 &, const T8 &)>
620
      function_t;
621
  typedef void (E::*memberFunction_ptr_t)(const T1 &, const T2 &, const T3 &,
622
                                          const T4 &, const T5 &, const T6 &,
623
                                          const T7 &, const T8 &);
624
625
  CommandVoid8(E &entity, function_t function, const std::string &docString)
626
      : Command(entity,
627
                boost::assign::list_of(ValueHelper<T1>::TypeID)(
628
                    ValueHelper<T2>::TypeID)(ValueHelper<T3>::TypeID)(
629
                    ValueHelper<T4>::TypeID)(ValueHelper<T5>::TypeID)(
630
                    ValueHelper<T6>::TypeID)(ValueHelper<T7>::TypeID)(
631
                    ValueHelper<T8>::TypeID),
632
                docString),
633
        fptr(function) {}
634
635
 protected:
636
  virtual Value doExecute() {
637
    assert(getParameterValues().size() == 8);
638
    T1 val1 = getParameterValues()[0].value();
639
    T2 val2 = getParameterValues()[1].value();
640
    T3 val3 = getParameterValues()[2].value();
641
    T4 val4 = getParameterValues()[3].value();
642
    T5 val5 = getParameterValues()[4].value();
643
    T6 val6 = getParameterValues()[5].value();
644
    T7 val7 = getParameterValues()[6].value();
645
    T8 val8 = getParameterValues()[7].value();
646
    fptr(val1, val2, val3, val4, val5, val6, val7, val8);
647
    return Value();  // void
648
  }
649
650
 private:
651
  function_t fptr;
652
};
653
654
template <class E, typename T1, typename T2, typename T3, typename T4,
655
          typename T5, typename T6, typename T7, typename T8>
656
CommandVoid8<E, T1, T2, T3, T4, T5, T6, T7, T8> *makeCommandVoid8(
657
    E &entity,
658
    typename CommandVoid8<E, T1, T2, T3, T4, T5, T6, T7, T8>::function_t
659
        function,
660
    const std::string &docString) {
661
  return new CommandVoid8<E, T1, T2, T3, T4, T5, T6, T7, T8>(entity, function,
662
                                                             docString);
663
}
664
665
template <class E, typename T1, typename T2, typename T3, typename T4,
666
          typename T5, typename T6, typename T7, typename T8>
667
CommandVoid8<E, T1, T2, T3, T4, T5, T6, T7, T8> *makeCommandVoid8(
668
    E &entity,
669
    boost::function<void(E *, const T1 &, const T2 &, const T3 &, const T4 &,
670
                         const T5 &, const T6 &, const T7 &, const T8 &)>
671
        function,
672
    const std::string &docString) {
673
  return new CommandVoid8<E, T1, T2, T3, T4, T5, T6, T7, T8>(
674
      entity, boost::bind(function, &entity, _1, _2, _3, _4, _5, _6, _7, _8),
675
      docString);
676
}
677
678
template <class E, typename T1, typename T2, typename T3, typename T4,
679
          typename T5, typename T6, typename T7, typename T8>
680
CommandVoid8<E, T1, T2, T3, T4, T5, T6, T7, T8> *makeCommandVoid8(
681
    E &entity,
682
    void (E::*function)(const T1 &, const T2 &, const T3 &, const T4 &,
683
                        const T5 &, const T6 &, const T7 &, const T8 &),
684
    const std::string &docString) {
685
  return new CommandVoid8<E, T1, T2, T3, T4, T5, T6, T7, T8>(
686
      entity, boost::bind(function, &entity, _1, _2, _3, _4, _5, _6, _7, _8),
687
      docString);
688
  return NULL;
689
}
690
691
inline std::string docCommandVoid8(
692
    const std::string &doc, const std::string &type1, const std::string &type2,
693
    const std::string &type3, const std::string &type4,
694
    const std::string &type5, const std::string &type6,
695
    const std::string &type7, const std::string &type8) {
696
  return (std::string("\n") + doc + "\n\n" + "Input:\n - A " + type1 + ".\n" +
697
          "Input:\n - A " + type2 + ".\n" + "Input:\n - A " + type3 + ".\n" +
698
          "Input:\n - A " + type4 + ".\n" + "Input:\n - A " + type5 + ".\n" +
699
          "Input:\n - A " + type6 + ".\n" + "Input:\n - A " + type7 + ".\n" +
700
          "Input:\n - A " + type8 + ".\n" + "Void return.\n\n");
701
}
702
703
}  // namespace command
704
}  // namespace dynamicgraph
705
706
/* --- FUNCTION VERBOSE ----------------------------------------------------- */
707
/* This bind a function void f( ostream& ) that display some results into
708
 * a string f( void ) that return some string results. */
709
710
namespace dynamicgraph {
711
namespace command {
712
template <class E>
713
struct CommandVerbose : public Command {
714
  typedef boost::function<void(std::ostream &)> function_t;
715
716
1
  CommandVerbose(E &entity, function_t function, const std::string &docString)
717
1
      : Command(entity, EMPTY_ARG, docString), fptr(function) {}
718
719
 protected:
720
  virtual Value doExecute() {
721
    assert(getParameterValues().size() == 0);
722
    std::ostringstream oss;
723
    fptr(oss);
724
    return Value(oss.str());  // return string
725
  }
726
727
 private:
728
  function_t fptr;
729
};
730
731
template <class E>
732
CommandVerbose<E> *makeCommandVerbose(
733
    E &entity, typename CommandVerbose<E>::function_t function,
734
    const std::string &docString) {
735
  return new CommandVerbose<E>(entity, function, docString);
736
  return NULL;
737
}
738
739
template <class E>
740
1
CommandVerbose<E> *makeCommandVerbose(E &entity,
741
                                      void (E::*function)(std::ostream &),
742
                                      const std::string &docString) {
743
1
  return new CommandVerbose<E>(entity, boost::bind(function, &entity, _1),
744
2
                               docString);
745
  return NULL;
746
}
747
748
1
inline std::string docCommandVerbose(const std::string &doc) {
749

2
  return std::string("\n") + doc + "\n\nNo input.\n Return a string.\n\n";
750
}
751
/*************************/
752
/* Template return types */
753
/*************************/
754
755
template <class E, class ReturnType>
756
struct CommandReturnType0 : public Command {
757
  CommandReturnType0(E &entity, boost::function<ReturnType(void)> function,
758
                     const std::string &docString)
759
      : Command(entity, EMPTY_ARG, docString), fptr(function) {}
760
761
 protected:
762
  virtual Value doExecute() {
763
    assert(getParameterValues().size() == 0);
764
    Value res(fptr());
765
    return res;
766
  }
767
768
 private:
769
  boost::function<ReturnType(void)> fptr;
770
};
771
772
template <class E, class ReturnType>
773
CommandReturnType0<E, ReturnType> *makeCommandReturnType0(
774
    E &entity, boost::function<ReturnType(void)> function,
775
    const std::string &docString) {
776
  return new CommandReturnType0<E, ReturnType>(entity, function, docString);
777
}
778
779
template <class E, class ReturnType>
780
CommandReturnType0<E, ReturnType> *makeCommandReturnType0(
781
    E &entity, boost::function<ReturnType(E *)> function,
782
    const std::string &docString) {
783
  return new CommandReturnType0<E, ReturnType>(
784
      entity, boost::bind(function, &entity), docString);
785
}
786
787
template <class E, class ReturnType>
788
CommandReturnType0<E, ReturnType> *makeCommandReturnType0(
789
    E &entity, ReturnType (E::*function)(void), const std::string &docString) {
790
  return new CommandReturnType0<E, ReturnType>(
791
      entity, boost::bind(function, &entity), docString);
792
}
793
794
template <typename ReturnType>
795
inline std::string docCommandReturnType0(
796
    const std::string &doc, const std::string & /* return_type */) {
797
  return std::string("\n") + doc + "\n\nNo input.\n" +
798
         typeid(ReturnType).name() + " return.\n\n";
799
}
800
801
}  // namespace command
802
}  // namespace dynamicgraph
803
804
/* --- FUNCTION 1 ARGS ------------------------------------------------------ */
805
namespace dynamicgraph {
806
namespace command {
807
808
template <class E, typename ReturnType, typename T>
809
struct CommandReturnType1 : public Command {
810
  typedef boost::function<ReturnType(const T &)> function_t;
811
812
1
  CommandReturnType1(E &entity, function_t function,
813
                     const std::string &docString)
814
      : Command(entity, boost::assign::list_of(ValueHelper<T>::TypeID),
815
                docString),
816

1
        fptr(function) {}
817
818
 protected:
819
1
  virtual Value doExecute() {
820

1
    assert(getParameterValues().size() == 1);
821

1
    T val = getParameterValues()[0].value();
822

1
    Value res(fptr(val));
823
2
    return res;
824
  }
825
826
 private:
827
  function_t fptr;
828
};
829
830
template <class E, typename ReturnType, typename T>
831
CommandReturnType1<E, ReturnType, T> *makeCommandReturnType1(
832
    E &entity, boost::function<ReturnType(const T &)> function,
833
    const std::string &docString) {
834
  return new CommandReturnType1<E, ReturnType, T>(entity, function, docString);
835
}
836
837
template <class E, typename ReturnType, typename T>
838
CommandReturnType1<E, ReturnType, T> *makeCommandReturnType1(
839
    E &entity,
840
    // The following syntaxt don't compile when not
841
    // specializing the template arg... why ???
842
    boost::function<ReturnType(E *, const T &)> function,
843
    const std::string &docString) {
844
  return new CommandReturnType1<E, ReturnType, T>(
845
      entity, boost::bind(function, &entity, _1), docString);
846
}
847
848
template <class E, typename ReturnType, typename T>
849
1
CommandReturnType1<E, ReturnType, T> *makeCommandReturnType1(
850
    E &entity, ReturnType (E::*function)(const T &),
851
    const std::string &docString) {
852
1
  return new CommandReturnType1<E, ReturnType, T>(
853
2
      entity, boost::bind(function, &entity, _1), docString);
854
  return NULL;
855
}
856
857
template <typename ReturnType>
858
inline std::string docCommandReturnType1(const std::string &doc,
859
                                         const std::string &type) {
860
  return std::string("\n") + doc + "\n\nInput:\n - A " + type + ".\n" +
861
         typeid(ReturnType).name() + "return.\n\n";
862
}
863
864
}  // namespace command
865
}  // namespace dynamicgraph
866
867
/*********** FUNCTION 2 Arguments ************************/
868
namespace dynamicgraph {
869
namespace command {
870
871
template <class E, typename ReturnType, typename T1, typename T2>
872
struct CommandReturnType2 : public Command {
873
  typedef boost::function<ReturnType(const T1 &, const T2 &)> function_t;
874
875
1
  CommandReturnType2(E &entity, function_t function,
876
                     const std::string &docString)
877
      : Command(entity,
878
1
                boost::assign::list_of(ValueHelper<T1>::TypeID)(
879
                    ValueHelper<T2>::TypeID),
880
                docString),
881

2
        fptr(function) {}
882
883
 protected:
884
1
  virtual Value doExecute() {
885

1
    assert(getParameterValues().size() == 2);
886

1
    T1 val1 = getParameterValues()[0].value();
887

1
    T2 val2 = getParameterValues()[1].value();
888

1
    Value res(fptr(val1, val2));
889
2
    return res;
890
  }
891
892
 private:
893
  function_t fptr;
894
};
895
896
template <class E, typename ReturnType, typename T1, typename T2>
897
CommandReturnType2<E, ReturnType, T1, T2> *makeCommandReturnType2(
898
    E &entity, boost::function<ReturnType(const T1 &, const T2 &)> function,
899
    const std::string &docString) {
900
  return new CommandReturnType2<E, ReturnType, T1, T2>(entity, function,
901
                                                       docString);
902
}
903
904
template <class E, typename ReturnType, typename T1, typename T2>
905
CommandReturnType2<E, ReturnType, T1, T2> *makeCommandReturnType2(
906
    E &entity,
907
    // The following syntaxt don't compile when not specializing the template
908
    // arg... why ???
909
    boost::function<ReturnType(E *, const T1 &, const T2 &)> function,
910
    const std::string &docString) {
911
  return new CommandReturnType2<E, ReturnType, T1, T2>(
912
      entity, boost::bind(function, &entity, _1, _2), docString);
913
}
914
915
template <class E, typename ReturnType, typename T1, typename T2>
916
1
CommandReturnType2<E, ReturnType, T1, T2> *makeCommandReturnType2(
917
    E &entity, ReturnType (E::*function)(const T1 &, const T2 &),
918
    const std::string &docString) {
919
1
  return new CommandReturnType2<E, ReturnType, T1, T2>(
920
2
      entity, boost::bind(function, &entity, _1, _2), docString);
921
  return NULL;
922
}
923
924
template <typename ReturnType>
925
inline std::string docCommandReturnType2(const std::string &doc,
926
                                         const std::string &type1,
927
                                         const std::string &type2) {
928
  return (std::string("\n") + doc + "\n\n" + "Input:\n - A " + type1 + ".\n" +
929
          "Input:\n - A " + type2 + ".\n" +
930
          "ReturnType:\n - Returns:" + typeid(ReturnType).name() + +".\n\n");
931
}
932
933
}  // namespace command
934
}  // namespace dynamicgraph
935
936
#endif  // __dg_command_bind_h__