cisst-saw
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
cmnClassServices.h
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* ex: set filetype=cpp softtabstop=4 shiftwidth=4 tabstop=4 cindent expandtab: */
3 
4 /*
5 
6  Author(s): Anton Deguet
7  Created on: 2004-08-18
8 
9  (C) Copyright 2004-2014 Johns Hopkins University (JHU), All Rights Reserved.
10 
11 --- begin cisst license - do not edit ---
12 
13 This software is provided "as is" under an open source license, with
14 no warranty. The complete license can be found in license.txt and
15 http://www.cisst.org/cisst/license.txt.
16 
17 --- end cisst license ---
18 
19 */
20 
21 
26 #pragma once
27 
28 #ifndef _cmnClassServices_h
29 #define _cmnClassServices_h
30 
35 #include <cisstCommon/cmnLogger.h>
37 
44 //************************ Factory with Default Constructor ***********************
45 
49 template<bool _enabled, typename _class>
51 {
52 public:
55  inline static cmnGenericObject * Create(void) {
56  return 0;
57  }
58 
61  inline static cmnGenericObject * CreateArray(size_t CMN_UNUSED(size)) {
62  return 0;
63  }
64 
65  inline static bool DefaultConstructorAvailable(void) { return false; }
66 };
67 
68 
72 template <typename _class>
74 {
75  typedef _class value_type;
76 public:
77 
82  inline static cmnGenericObject * Create(void) {
83  return new value_type;
84  }
85 
90  inline static cmnGenericObject * CreateArray(size_t size) {
91  return new value_type[size];
92  }
93 
94  inline static bool DefaultConstructorAvailable(void) { return true; }
95 };
96 
97 //************************ Factory with Copy Constructor ***********************
98 
102 template<bool _enabled, typename _class>
104 {
105 public:
106 
109  inline static cmnGenericObject * Create(const cmnGenericObject & CMN_UNUSED(other)) {
110  return 0;
111  }
112 
114  inline static bool Create(cmnGenericObject * CMN_UNUSED(existing), const cmnGenericObject & CMN_UNUSED(other)) {
115  return false;
116  }
117 
120  inline static cmnGenericObject * CreateArray(size_t CMN_UNUSED(size), const cmnGenericObject & CMN_UNUSED(other)) {
121  return 0;
122  }
123 
124  inline static bool CopyConstructorAvailable(void) { return false; }
125 };
126 
127 
131 template <typename _class>
133 {
134 public:
135  typedef _class value_type;
136  typedef _class * pointer;
137 
141  inline static cmnGenericObject * Create(const cmnGenericObject & other) {
142  const value_type * otherPointer = dynamic_cast<const value_type *>(&other);
143  if (otherPointer)
144  return new value_type(*otherPointer);
145  else
146  return 0;
147  }
148 
155  inline static bool Create(cmnGenericObject * existing, const cmnGenericObject & other) {
156  if (existing->Services() != other.Services()) {
157  CMN_LOG_RUN_WARNING << "cmnClassServices::Create with in-place new called for different classes, existing = "
158  << existing->Services()->GetName()
159  << ", other = " << other.Services()->GetName() << std::endl;
160  return false;
161  }
162  // If they already point to the same memory, just return
163  if (existing == &other)
164  return true;
165  const value_type * otherPointer = dynamic_cast<const value_type *>(&other);
166  if (otherPointer) {
167  existing->Services()->Delete(existing);
168  new(existing) value_type(*otherPointer);
169  return true;
170  } else {
171  return false;
172  }
173  }
174 
178  inline static cmnGenericObject * CreateArray(size_t size, const cmnGenericObject & other) {
179  const value_type * otherPointer = dynamic_cast<const value_type *>(&other);
180  if (otherPointer) {
181  pointer data = static_cast<pointer>(::operator new(sizeof(value_type) * size));
182  size_t index;
183  for (index = 0; index < size; index++) {
184  new(&(data[index])) value_type(*otherPointer); // placement new with copy constructor
185  }
186  return data;
187  }
188  return 0;
189  }
190 
191  inline static bool CopyConstructorAvailable(void) { return true; }
192 };
193 
194 //************************ Factory with One Arg Constructor ***********************
195 
199 template<int _dynamicCreation, typename _class, typename _argType>
201 {
202 public:
203 
206  inline static cmnGenericObject * Create(const cmnGenericObject & CMN_UNUSED(arg)) {
207  return 0;
208  }
209 
210  inline static bool OneArgConstructorAvailable(void) { return false; }
211 
212  inline static const cmnClassServicesBase *GetConstructorArgServices(void) {
213  return 0;
214  }
215 };
216 
222 template<typename _class, typename _argType>
224 {
225 public:
226  typedef _class value_type;
227 
229  inline static _class * Create(const cmnGenericObject & arg) {
230  const _argType *argTyped = dynamic_cast<const _argType *>(&arg);
231  if (argTyped)
232  return new value_type(*argTyped);
233  else {
234  CMN_LOG_INIT_WARNING << "cmnConditionalObjectFactoryOneArg: failed to dynamic cast from "
235  << arg.Services()->GetName() << " to "
236  << _argType::ClassServices()->GetName() << std::endl;
237  return 0;
238  }
239  }
240 
241  inline static bool OneArgConstructorAvailable(void) { return true; }
242 
243  inline static const cmnClassServicesBase *GetConstructorArgServices(void) {
244  return _argType::ClassServices();
245  }
246 };
247 
248 //************************ Destructors ***********************
249 
251 template<int _hasDynamicCreation, typename _class>
253 {
254  typedef _class value_type;
255  typedef _class * pointer;
257 public:
260  inline static bool DeleteArray(generic_pointer & data, size_t & size) {
261  pointer typedData = dynamic_cast<pointer>(data);
262  if (typedData) {
263  size_t index;
264  for (index = 0; index < size; index++) {
265  typedData[index].~value_type();
266  }
267  delete typedData;
268  data = 0;
269  size = 0;
270  return true;
271  }
272  return false;
273  }
274 
275 
278  inline static bool Delete(cmnGenericObject * existing) {
279  value_type * existingPointer = dynamic_cast<value_type *>(existing);
280  if (existingPointer) {
281  existingPointer->~value_type();
282  return true;
283  } else {
284  return false;
285  }
286  }
287 };
288 
290 template<typename _class>
292 {
294 public:
295  inline static bool DeleteArray(generic_pointer & CMN_UNUSED(data), size_t & CMN_UNUSED(size)) {
296  return false;
297  }
298 
299  inline static bool Delete(cmnGenericObject * CMN_UNUSED(existing)) {
300  return false;
301  }
302 };
303 
304 
305 //************************************ Class Services ****************************
314 template <int _dynamicCreation, class _class, class _argType = _class>
316 
323 
324  public:
325 
328 
329  /* documented in base class */
331 
340  cmnClassServices(const std::string & className, const std::type_info * typeInfo,
341  const cmnClassServicesBase * parentServices,
342  const std::string & libraryName,
344  BaseType(className, typeInfo, parentServices, libraryName, mask)
345  {}
346 
347  /* documented in base class */
348  virtual cmnGenericObject * Create(void) const {
350  }
351 
352  /* documented in base class */
353  virtual cmnGenericObject * Create(const cmnGenericObject & other) const {
354  return FactoryCopyType::Create(other);
355  }
356 
357  /* documented in base class */
358  virtual cmnGenericObject * CreateWithArg(const cmnGenericObject & arg) const {
359  return FactoryOneArgType::Create(arg);
360  }
361 
362  /* documented in base class */
363  virtual bool Create(cmnGenericObject * existing, const cmnGenericObject & other) const {
364  return FactoryCopyType::Create(existing, other);
365  }
366 
367  /* documented in base class */
368  virtual cmnGenericObject * CreateArray(size_t size) const {
369  return FactoryDefaultType::CreateArray(size);
370  }
371 
372  /* documented in base class */
373  virtual cmnGenericObject * CreateArray(size_t size, const cmnGenericObject & other) const {
374  return FactoryCopyType::CreateArray(size, other);
375  }
376 
377  /* documented in base class */
378  virtual bool DeleteArray(generic_pointer & data, size_t & size) const {
379  return DestructorType::DeleteArray(data, size);
380  }
381 
382  /* documented in base class */
383  virtual bool Delete(cmnGenericObject * existing) const {
384  return DestructorType::Delete(existing);
385  }
386 
387  /* documented in base class */
388  virtual size_t GetSize(void) const {
389  return sizeof(_class);
390  }
391 
392  /* documented in base class */
393  bool HasDynamicCreation(void) const { return (_dynamicCreation != CMN_NO_DYNAMIC_CREATION); }
397 
400  }
401 };
402 
403 #endif // _cmnClassServices_h
404 
const int CMN_DYNAMIC_CREATION_DEFAULT
Definition: cmnClassRegisterMacros.h:329
static bool Create(cmnGenericObject *existing, const cmnGenericObject &other)
Definition: cmnClassServices.h:155
Definition: cmnClassServices.h:50
static bool CopyConstructorAvailable(void)
Definition: cmnClassServices.h:124
cmnGenericObject * generic_pointer
Definition: cmnClassServices.h:330
static bool CopyConstructorAvailable(void)
Definition: cmnClassServices.h:191
virtual cmnGenericObject * Create(void) const
Definition: cmnClassServices.h:348
Portability across compilers and operating systems tools.
#define CMN_UNUSED(argument)
Definition: cmnPortability.h:479
_class value_type
Definition: cmnClassServices.h:135
Class registration macros.
virtual cmnGenericObject * Create(const cmnGenericObject &other) const
Definition: cmnClassServices.h:353
bool HasDynamicCreation(void) const
Definition: cmnClassServices.h:393
static bool DefaultConstructorAvailable(void)
Definition: cmnClassServices.h:94
static cmnGenericObject * Create(const cmnGenericObject &CMN_UNUSED(arg))
Definition: cmnClassServices.h:206
const std::string & GetName(void) const
cmnClassServicesBase BaseType
Definition: cmnClassServices.h:327
static const cmnClassServicesBase * GetConstructorArgServices(void)
Definition: cmnClassServices.h:243
Base class for high level objects.
Definition: cmnGenericObject.h:51
const int CMN_DYNAMIC_CREATION_ONEARG
Definition: cmnClassRegisterMacros.h:333
virtual const cmnClassServicesBase * Services(void) const =0
static cmnGenericObject * Create(void)
Definition: cmnClassServices.h:55
static cmnGenericObject * CreateArray(size_t CMN_UNUSED(size), const cmnGenericObject &CMN_UNUSED(other))
Definition: cmnClassServices.h:120
virtual bool DeleteArray(generic_pointer &data, size_t &size) const
Definition: cmnClassServices.h:378
static cmnGenericObject * Create(const cmnGenericObject &other)
Definition: cmnClassServices.h:141
static const cmnClassServicesBase * GetConstructorArgServices(void)
Definition: cmnClassServices.h:212
static cmnGenericObject * Create(void)
Definition: cmnClassServices.h:82
virtual cmnGenericObject * CreateArray(size_t size) const
Definition: cmnClassServices.h:368
static bool DefaultConstructorAvailable(void)
Definition: cmnClassServices.h:65
static bool OneArgConstructorAvailable(void)
Definition: cmnClassServices.h:210
#define CMN_LOG_RUN_WARNING
Definition: cmnLogger.h:167
Declaration of cmnLogger amd macros for human readable logging.
bool CopyConstructorAvailable(void) const
Definition: cmnClassServices.h:395
virtual cmnGenericObject * CreateWithArg(const cmnGenericObject &arg) const
Definition: cmnClassServices.h:358
static cmnGenericObject * Create(const cmnGenericObject &CMN_UNUSED(other))
Definition: cmnClassServices.h:109
Definition: cmnClassServices.h:252
static bool Delete(cmnGenericObject *CMN_UNUSED(existing))
Definition: cmnClassServices.h:299
Definition: cmnClassServices.h:200
virtual bool Delete(cmnGenericObject *existing) const
Definition: cmnClassServices.h:383
Class services.
Definition: cmnClassServices.h:315
Defines cmnGenericObject.
static cmnGenericObject * CreateArray(size_t CMN_UNUSED(size))
Definition: cmnClassServices.h:61
virtual bool Delete(cmnGenericObject *existing) const =0
virtual size_t GetSize(void) const
Definition: cmnClassServices.h:388
short cmnLogMask
Definition: cmnLogLoD.h:67
static bool DeleteArray(generic_pointer &data, size_t &size)
Definition: cmnClassServices.h:260
bool OneArgConstructorAvailable(void) const
Definition: cmnClassServices.h:396
static cmnGenericObject * CreateArray(size_t size, const cmnGenericObject &other)
Definition: cmnClassServices.h:178
Base class for class services.
Definition: cmnClassServicesBase.h:45
Defines the cmnClassServicesBase.
const cmnClassServicesBase * GetConstructorArgServices(void) const
Definition: cmnClassServices.h:398
static bool Create(cmnGenericObject *CMN_UNUSED(existing), const cmnGenericObject &CMN_UNUSED(other))
Definition: cmnClassServices.h:114
virtual bool Create(cmnGenericObject *existing, const cmnGenericObject &other) const
Definition: cmnClassServices.h:363
static bool DeleteArray(generic_pointer &CMN_UNUSED(data), size_t &CMN_UNUSED(size))
Definition: cmnClassServices.h:295
static bool Delete(cmnGenericObject *existing)
Definition: cmnClassServices.h:278
_class * pointer
Definition: cmnClassServices.h:136
static _class * Create(const cmnGenericObject &arg)
Definition: cmnClassServices.h:229
#define CMN_LOG_INIT_WARNING
Definition: cmnLogger.h:163
virtual cmnGenericObject * CreateArray(size_t size, const cmnGenericObject &other) const
Definition: cmnClassServices.h:373
static cmnGenericObject * CreateArray(size_t size)
Definition: cmnClassServices.h:90
static bool OneArgConstructorAvailable(void)
Definition: cmnClassServices.h:241
const int CMN_NO_DYNAMIC_CREATION
Definition: cmnClassRegisterMacros.h:328
Definition: cmnClassServices.h:103
bool DefaultConstructorAvailable(void) const
Definition: cmnClassServices.h:394
cmnClassServices(const std::string &className, const std::type_info *typeInfo, const cmnClassServicesBase *parentServices, const std::string &libraryName, cmnLogMask mask=CMN_LOG_ALLOW_DEFAULT)
Definition: cmnClassServices.h:340
const int CMN_DYNAMIC_CREATION_COPY
Definition: cmnClassRegisterMacros.h:330
#define CMN_LOG_ALLOW_DEFAULT
Definition: cmnLogLoD.h:76