cisst-saw
Loading...
Searching...
No Matches
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-2019 Johns Hopkins University (JHU), All Rights Reserved.
10
11--- begin cisst license - do not edit ---
12
13This software is provided "as is" under an open source license, with
14no warranty. The complete license can be found in license.txt and
15http://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
37
43
44//************************ Factory with Default Constructor ***********************
45
49template<bool _enabled, typename _class>
51{
52public:
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
72template <typename _class>
74{
75 typedef _class value_type;
76public:
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
102template<bool _enabled, typename _class>
104{
105public:
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
131template <typename _class>
133{
134public:
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 they already point to the same memory, just return
157 if (existing == &other)
158 return true;
159 if (existing->Services() != other.Services()) {
160 CMN_LOG_RUN_WARNING << "cmnClassServices::Create with in-place new called for different classes, existing = "
161 << existing->Services()->GetName()
162 << ", other = " << other.Services()->GetName() << std::endl;
163 return false;
164 }
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
199template<int _dynamicCreation, typename _class, typename _argType>
201{
202public:
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
213 return 0;
214 }
215};
216
222template<typename _class, typename _argType>
224{
225public:
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
244 return _argType::ClassServices();
245 }
246};
247
248//************************ Destructors ***********************
249
251template<int _hasDynamicCreation, typename _class>
253{
254 typedef _class value_type;
255 typedef _class * pointer;
256 typedef cmnGenericObject * generic_pointer;
257public:
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
290template<typename _class>
292{
293 typedef cmnGenericObject * generic_pointer;
294public:
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 ****************************
314template <int _dynamicCreation, class _class, class _argType = _class>
316
318 ((_dynamicCreation&CMN_DYNAMIC_CREATION_DEFAULT) == CMN_DYNAMIC_CREATION_DEFAULT), _class> FactoryDefaultType;
320 ((_dynamicCreation&CMN_DYNAMIC_CREATION_COPY) == CMN_DYNAMIC_CREATION_COPY), _class> FactoryCopyType;
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 {
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
401};
402
403#endif // _cmnClassServices_h
404
Base class for class services.
Definition cmnClassServicesBase.h:46
const std::string & GetName(void) const
cmnClassServicesBase(const std::string &className, const std::type_info *typeInfo, const cmnClassServicesBase *parentServices, const std::string &libraryName, cmnLogMask mask=CMN_LOG_ALLOW_DEFAULT)
virtual bool Delete(cmnGenericObject *existing) const =0
virtual cmnGenericObject * Create(void) const
Definition cmnClassServices.h:348
cmnClassServicesBase BaseType
Definition cmnClassServices.h:327
bool CopyConstructorAvailable(void) const
Definition cmnClassServices.h:395
const cmnClassServicesBase * GetConstructorArgServices(void) const
Definition cmnClassServices.h:398
virtual size_t GetSize(void) const
Definition cmnClassServices.h:388
bool HasDynamicCreation(void) const
Definition cmnClassServices.h:393
cmnGenericObject * generic_pointer
Definition cmnClassServices.h:330
virtual cmnGenericObject * CreateArray(size_t size) const
Definition cmnClassServices.h:368
bool OneArgConstructorAvailable(void) const
Definition cmnClassServices.h:396
virtual cmnGenericObject * CreateWithArg(const cmnGenericObject &arg) const
Definition cmnClassServices.h:358
virtual bool DeleteArray(generic_pointer &data, size_t &size) const
Definition cmnClassServices.h:378
bool DefaultConstructorAvailable(void) const
Definition cmnClassServices.h:394
virtual bool Create(cmnGenericObject *existing, const cmnGenericObject &other) const
Definition cmnClassServices.h:363
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
virtual cmnGenericObject * CreateArray(size_t size, const cmnGenericObject &other) const
Definition cmnClassServices.h:373
virtual bool Delete(cmnGenericObject *existing) const
Definition cmnClassServices.h:383
virtual cmnGenericObject * Create(const cmnGenericObject &other) const
Definition cmnClassServices.h:353
static bool Delete(cmnGenericObject *CMN_UNUSED(existing))
Definition cmnClassServices.h:299
static bool DeleteArray(generic_pointer &CMN_UNUSED(data), size_t &CMN_UNUSED(size))
Definition cmnClassServices.h:295
Definition cmnClassServices.h:253
static bool DeleteArray(generic_pointer &data, size_t &size)
Definition cmnClassServices.h:260
static bool Delete(cmnGenericObject *existing)
Definition cmnClassServices.h:278
static cmnGenericObject * Create(const cmnGenericObject &other)
Definition cmnClassServices.h:141
static bool CopyConstructorAvailable(void)
Definition cmnClassServices.h:191
static bool Create(cmnGenericObject *existing, const cmnGenericObject &other)
Definition cmnClassServices.h:155
_class value_type
Definition cmnClassServices.h:135
static cmnGenericObject * CreateArray(size_t size, const cmnGenericObject &other)
Definition cmnClassServices.h:178
_class * pointer
Definition cmnClassServices.h:136
Definition cmnClassServices.h:104
static bool Create(cmnGenericObject *CMN_UNUSED(existing), const cmnGenericObject &CMN_UNUSED(other))
Definition cmnClassServices.h:114
static cmnGenericObject * CreateArray(size_t CMN_UNUSED(size), const cmnGenericObject &CMN_UNUSED(other))
Definition cmnClassServices.h:120
static bool CopyConstructorAvailable(void)
Definition cmnClassServices.h:124
static cmnGenericObject * Create(const cmnGenericObject &CMN_UNUSED(other))
Definition cmnClassServices.h:109
static bool DefaultConstructorAvailable(void)
Definition cmnClassServices.h:94
static cmnGenericObject * CreateArray(size_t size)
Definition cmnClassServices.h:90
static cmnGenericObject * Create(void)
Definition cmnClassServices.h:82
Definition cmnClassServices.h:51
static cmnGenericObject * Create(void)
Definition cmnClassServices.h:55
static bool DefaultConstructorAvailable(void)
Definition cmnClassServices.h:65
static cmnGenericObject * CreateArray(size_t CMN_UNUSED(size))
Definition cmnClassServices.h:61
static const cmnClassServicesBase * GetConstructorArgServices(void)
Definition cmnClassServices.h:243
static bool OneArgConstructorAvailable(void)
Definition cmnClassServices.h:241
static _class * Create(const cmnGenericObject &arg)
Definition cmnClassServices.h:229
Definition cmnClassServices.h:201
static bool OneArgConstructorAvailable(void)
Definition cmnClassServices.h:210
static cmnGenericObject * Create(const cmnGenericObject &CMN_UNUSED(arg))
Definition cmnClassServices.h:206
static const cmnClassServicesBase * GetConstructorArgServices(void)
Definition cmnClassServices.h:212
Base class for high level objects.
Definition cmnGenericObject.h:53
virtual const cmnClassServicesBase * Services(void) const =0
_elementType value_type
Definition mtsGenericObjectProxy.h:329
Class registration macros.
const int CMN_DYNAMIC_CREATION_ONEARG
Definition cmnClassRegisterMacros.h:330
const int CMN_NO_DYNAMIC_CREATION
Definition cmnClassRegisterMacros.h:325
const int CMN_DYNAMIC_CREATION_DEFAULT
Definition cmnClassRegisterMacros.h:326
const int CMN_DYNAMIC_CREATION_COPY
Definition cmnClassRegisterMacros.h:327
Defines the cmnClassServicesBase.
Defines cmnGenericObject.
short cmnLogMask
Definition cmnLogLoD.h:67
#define CMN_LOG_ALLOW_DEFAULT
Definition cmnLogLoD.h:76
Declaration of cmnLogger amd macros for human readable logging.
#define CMN_LOG_RUN_WARNING
Definition cmnLogger.h:167
#define CMN_LOG_INIT_WARNING
Definition cmnLogger.h:163
Portability across compilers and operating systems tools.
#define CMN_UNUSED(argument)
Definition cmnPortability.h:497
size_type size(void) const
Definition vctDynamicConstMatrixBase.h:228