OpendTect  6.6
factory.h
Go to the documentation of this file.
1 #pragma once
2 
3 /*+
4 ________________________________________________________________________
5 
6  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
7  Author: A.H.Bril
8  Date: Sep 1994, Aug 2006
9  RCS: $Id$
10 ________________________________________________________________________
11 
12 -*/
13 
14 #include "basicmod.h"
15 #include "bufstringset.h"
16 #include "perthreadrepos.h"
17 #include "ptrman.h"
18 #include "typeset.h"
19 #include "uistring.h"
20 
27 {
28 public:
29  virtual ~FactoryBase();
30 
31  int size() const;
32  bool isEmpty() const;
33 
34  bool hasName(const char* n) {return indexOf(n)>=0;}
35  const BufferStringSet& getNames() const;
36  const uiStringSet& getUserNames() const;
37  void setDefaultName(int idx);
40  const char* getDefaultName() const;
41  static char cSeparator() { return ','; }
42 
43  BufferString& errMsg() const;
46 
47  const char* currentName() const;
55 protected:
56 
57  int indexOf(const char*) const;
58  void addNames(const char*,const uiString&);
59  void setNames(int,const char*,const uiString&);
60 
63 
64 private:
65 
70 };
71 
72 
116 template <class T>
117 mClass(Basic) Factory : public FactoryBase
119 public:
120  typedef T* (*Creator)();
121  inline void addCreator(Creator,const char* nm,
122  const uiString& username =
131  inline T* create(const char* nm) const;
133 protected:
134 
136 };
137 
138 
187 template <class T, class P>
190 public:
191  typedef T* (*Creator)(P);
192  inline void addCreator(Creator,const char* nm=nullptr,
193  const uiString& usernm =
201  inline T* create(const char* nm, P, bool chknm=true)const;
204 protected:
205 
207 };
208 
209 
214 template <class T, class P0, class P1>
216 {
217 public:
218  typedef T* (*Creator)(P0,P1);
219  inline void addCreator(Creator,const char* nm=nullptr,
220  const uiString& usernm=uiString::emptyString());
227  inline T* create(const char* nm, P0, P1,
228  bool chknm=true)const;
231 protected:
232 
234 };
235 
236 
241 template <class T, class P0, class P1, class P2>
243 {
244 public:
245  typedef T* (*Creator)(P0,P1,P2);
246  inline void addCreator(Creator,const char* nm=nullptr,
247  const uiString& usernm =uiString::emptyString());
254  inline T* create(const char* nm, P0, P1, P2,
255  bool chknm=true)const;
258 protected:
259 
261 };
262 
263 
264 #define mDefaultFactoryStringImpl \
265  const char* factoryKeyword() const { return sFactoryKeyword(); } \
266  uiString factoryDisplayName() const \
267  { return sFactoryDisplayName(); }
268 
269 #define mDefaultStaticFactoryStringDeclaration \
270  static const char* sFactoryKeyword(); \
271  static uiString sFactoryDisplayName()
272 
273 #define mDefaultFactoryInitClassImpl( baseclss, createfunc ) \
274 { \
275  baseclss::factory().addCreator(createfunc,sFactoryKeyword(), \
276  sFactoryDisplayName()); \
277 }
278 
279 #define mDefaultFactoryInstanciationBase( keywrd, usernm ) \
280  mDefaultFactoryStringImpl \
281  static const char* sFactoryKeyword() { return keywrd; } \
282  static uiString sFactoryDisplayName() { return usernm; } \
283  static void initClass()
284 
285 #define mDefaultFactoryCreatorImpl( baseclss, clss ) \
286 static baseclss* createInstance() { return new clss; } \
287 
288 #define mDefaultFactoryInstantiation( baseclss, clss, keywrd, usernm ) \
289  mDefaultFactoryCreatorImpl( baseclss, clss ); \
290  mDefaultFactoryInstanciationBase( keywrd, usernm ) \
291  mDefaultFactoryInitClassImpl( baseclss, createInstance )
292 
293 
294 #define mDefaultFactoryCreatorImpl1Param( baseclss, clss, parclss ) \
295 static baseclss* createInstance( parclss p1 ) \
296  { return new clss( p1 ); }
297 
298 #define mDefaultFactoryInstantiation1Param( baseclss, clss, parclss,\
299  keywrd, usernm ) \
300  mDefaultFactoryCreatorImpl1Param( baseclss, clss, parclss ) \
301  mDefaultFactoryInstanciationBase( keywrd, usernm ) \
302  mDefaultFactoryInitClassImpl( baseclss, createInstance )
303 
304 #define mDefaultFactoryCreatorImpl2Param( baseclss, clss, parclss1, parclss2 ) \
305 static baseclss* createInstance( parclss1 p1, parclss2 p2 ) \
306  { return new clss( p1, p2 ); }
307 
308 #define mDefaultFactoryInstantiation2Param( baseclss, clss, parclss1,\
309  parclss2, keywrd, usernm ) \
310  mDefaultFactoryCreatorImpl2Param( baseclss, clss, parclss1, parclss2 ) \
311  mDefaultFactoryInstanciationBase( keywrd, usernm ) \
312  mDefaultFactoryInitClassImpl( baseclss, createInstance )
313 
314 
315 #define mCreateImpl( donames, createfunc ) \
316  currentname_.getObject() = name; \
317  if ( donames ) \
318  { \
319  const int idx = indexOf( name ); \
320  if ( idx==-1 ) \
321  { \
322  errmsgs_.getObject() = "Name "; \
323  errmsgs_.getObject().add( name ).add(" not found.\n" ) \
324  .add( "Perhaps all plugins are not loaded\n" );\
325  return 0; \
326  } \
327  return createfunc; \
328  } \
329  \
330  for ( int idx=0; idx<creators_.size(); idx++ ) \
331  { \
332  T* res = createfunc; \
333  if ( res ) return res; \
334  } \
335  \
336  return 0
337 
338 
339 #define mAddCreator \
340  const int idx = indexOf( name );\
341 \
342  if ( idx==-1 )\
343  { \
344  addNames( name, username ); \
345  creators_ += cr; \
346  } \
347  else\
348  {\
349  setNames( idx, name, username ); \
350  creators_[idx] = cr;\
351  }
352 
353 template <class T> inline
354 void Factory<T>::addCreator( Creator cr, const char* name,
355  const uiString& username )
356 {
357  if ( !name ) return;\
358  mAddCreator;
359 }
360 
361 
362 template <class T> inline
363 T* Factory<T>::create( const char* name ) const
364 {
365  mCreateImpl( true, creators_[idx]() );
366 }
367 
368 
369 template <class T, class P> inline
370 void Factory1Param<T,P>::addCreator( Creator cr, const char* name,
371  const uiString& username )
372 {
373  mAddCreator;
374 }
375 
376 
377 template <class T, class P> inline
378 T* Factory1Param<T,P>::create( const char* name, P data, bool chk ) const
379 {
380  mCreateImpl( chk, creators_[idx]( data ) );
381 }
382 
383 
384 template <class T, class P0, class P1> inline
385 void Factory2Param<T,P0,P1>::addCreator( Creator cr, const char* name,
386  const uiString& username )
387 {
388  mAddCreator;
389 }
390 
391 
392 template <class T, class P0, class P1> inline
393 T* Factory2Param<T,P0,P1>::create( const char* name, P0 p0, P1 p1,
394  bool chk ) const
395 {
396  mCreateImpl( chk, creators_[idx]( p0, p1 ) );
397 }
398 
399 
400 template <class T, class P0, class P1, class P2> inline
401 void Factory3Param<T,P0,P1,P2>::addCreator( Creator cr, const char* name,
402  const uiString& username )
403 {
404  mAddCreator;
405 }
406 
407 
408 template <class T, class P0, class P1, class P2> inline
409 T* Factory3Param<T,P0,P1,P2>::create( const char* name, P0 p0, P1 p1, P2 p2,
410  bool chk ) const
411 {
412  mCreateImpl( chk, creators_[idx]( p0, p1, p2 ) );
413 }
414 
415 
416 #define mDefineFactory( mod, T, funcname ) \
417 mGlobal(mod) ::Factory<T>& funcname()
418 
419 
420 #define mDefineFactoryInClasswKW( T, funcname, kw ) \
421 static ::Factory<T>& funcname(); \
422 virtual uiString factoryDisplayName() const \
423 { return ::toUiString( factoryKeyword() ); } \
424 virtual const char* factoryKeyword() const { return kw; }
425 #define mDefineFactoryInClass( T, funcname ) \
426  mDefineFactoryInClasswKW( T, funcname, nullptr )
427 
428 
429 #define mImplFactory( T, funcname ) \
430 ::Factory<T>& funcname() \
431 { \
432  mDefineStaticLocalObject(PtrMan< ::Factory<T> >,inst,(new ::Factory<T>)); \
433  return *inst; \
434 }
435 
436 
437 #define mDefineFactory1Param( mod, T, P, funcname ) \
438 mGlobal(mod) ::Factory1Param<T,P>& funcname()
439 
440 
441 #define mDefineFactory1ParamInClasswKW( T, P, funcname, kw ) \
442 static ::Factory1Param<T,P>& funcname(); \
443 virtual uiString factoryDisplayName() const \
444 { return ::toUiString(factoryKeyword()); } \
445 virtual const char* factoryKeyword() const { return kw; }
446 #define mDefineFactory1ParamInClass( T, P, funcname ) \
447  mDefineFactory1ParamInClasswKW( T, P, funcname, nullptr )
448 
449 #define mImplFactory1Param( T, P, funcname ) \
450 ::Factory1Param<T,P>& funcname() \
451 { \
452  static PtrMan< ::Factory1Param<T,P> > \
453  inst(new ::Factory1Param<T,P>); \
454  return *inst; \
455 }
456 
457 
458 #define mDefineFactory2Param( mod, T, P0, P1, funcname ) \
459 mGlobal(mod) ::Factory2Param<T,P0,P1>& funcname()
460 
461 
462 #define mDefineFactory2ParamInClasswKW( T, P0, P1, funcname, kw ) \
463 static ::Factory2Param<T,P0,P1>& funcname(); \
464 virtual uiString factoryDisplayName() const \
465 { return ::toUiString( factoryKeyword() ); } \
466 virtual const char* factoryKeyword() const { return kw; }
467 #define mDefineFactory2ParamInClass( T, P0, P1, funcname ) \
468  mDefineFactory2ParamInClasswKW( T, P0, P1, funcname, nullptr )
469 
470 
471 #define mImplFactory2Param( T, P0, P1, funcname ) \
472 ::Factory2Param<T,P0,P1>& funcname() \
473 { \
474  static PtrMan< ::Factory2Param<T,P0,P1> > \
475  inst(new ::Factory2Param<T,P0,P1>); \
476  return *inst; \
477 }
478 
479 
480 #define mDefineFactory3Param( mod, T, P0, P1, P2, funcname ) \
481 mGlobal(mod) ::Factory3Param<T,P0,P1,P2>& funcname()
482 
483 
484 #define mDefineFactory3ParamInClasswKW( T, P0, P1, P2, funcname, kw ) \
485 static ::Factory3Param<T,P0,P1,P2>& funcname(); \
486 virtual uiString factoryDisplayName() const \
487 { return ::toUiString( factoryKeyword() ); } \
488 virtual const char* factoryKeyword() const { return kw; }
489 #define mDefineFactory3ParamInClass( T, P0, P1, P2, funcname ) \
490  mDefineFactory3ParamInClasswKW( T, P0, P1, P2, funcname, nullptr )
491 
492 
493 #define mImplFactory3Param( T, P0, P1, P2,funcname ) \
494 ::Factory3Param<T,P0,P1,P2>& funcname() \
495 { \
496  static PtrMan< ::Factory3Param<T,P0,P1,P2> > \
497  inst(new ::Factory3Param<T,P0,P1,P2>); \
498  return *inst; \
499 }
500 
501 #undef mCreateImpl
502 #undef mAddCreator
503 
Factory2Param::addCreator
void addCreator(Creator, const char *nm=nullptr, const uiString &usernm=uiString::emptyString())
Definition: factory.h:385
FactoryBase::defaultname_
BufferString defaultname_
Definition: factory.h:69
Factory1Param::creators_
TypeSet< Creator > creators_
Definition: factory.h:206
FactoryBase::isEmpty
bool isEmpty() const
FactoryBase::currentName
const char * currentName() const
uistring.h
uiStringSet
Definition: uistringset.h:23
PerThreadObjectRepository< BufferString >
BufferStringSet
Set of BufferString objects.
Definition: bufstringset.h:26
mAddCreator
#define mAddCreator
Definition: factory.h:339
FactoryBase::setNames
void setNames(int, const char *, const uiString &)
Factory3Param
Subclass of FactoryBase.
Definition: factory.h:243
FactoryBase::names_
BufferStringSet names_
Definition: factory.h:66
Factory3Param::creators_
TypeSet< Creator > creators_
Definition: factory.h:260
FactoryBase
Base class for Factories ( Factory, Factory1Param, Factory2Param and Factory3Param....
Definition: factory.h:27
mExpClass
#define mExpClass(module)
Definition: commondefs.h:177
Seis::P
@ P
Definition: seistype.h:60
FactoryBase::getUserNames
const uiStringSet & getUserNames() const
Factory1Param::create
T * create(const char *nm, P, bool chknm=true) const
Definition: factory.h:378
typeset.h
Factory::create
T * create(const char *nm) const
Name may be not be null.
Definition: factory.h:363
mODTextTranslationClass
#define mODTextTranslationClass(clss)
Definition: uistring.h:40
FactoryBase::errMsg
BufferString & errMsg() const
FactoryBase::usernames_
uiStringSet usernames_
Definition: factory.h:67
Factory2Param
Subclass of FactoryBase.
Definition: factory.h:216
Factory::creators_
TypeSet< Creator > creators_
Definition: factory.h:135
FactoryBase::size
int size() const
ptrman.h
FactoryBase::getNames
const BufferStringSet & getNames() const
indexOf
BufferStringSet::idx_type indexOf(const BufferStringSet &, const char *)
FactoryBase::indexOf
int indexOf(const char *) const
FactoryBase::aliases_
BufferStringSet aliases_
Definition: factory.h:68
FactoryBase::cSeparator
static char cSeparator()
Definition: factory.h:41
mClass
#define mClass(module)
Definition: commondefs.h:181
FactoryBase::hasName
bool hasName(const char *n)
Definition: factory.h:34
FactoryBase::~FactoryBase
virtual ~FactoryBase()
Factory1Param::addCreator
void addCreator(Creator, const char *nm=nullptr, const uiString &usernm=uiString::emptyString())
Definition: factory.h:370
Factory2Param::creators_
TypeSet< Creator > creators_
Definition: factory.h:233
FactoryBase::getDefaultName
const char * getDefaultName() const
Factory
Generalized static factory that can deliver instances of T, when no variable is needed in the creatio...
Definition: factory.h:118
Factory::addCreator
void addCreator(Creator, const char *nm, const uiString &username=uiString::emptyString())
Definition: factory.h:354
FactoryBase::currentname_
StaticStringManager currentname_
Definition: factory.h:62
BufferString
OD::String with its own variable length buffer. The buffer has a guaranteed minimum size.
Definition: bufstring.h:40
bufstringset.h
uiString
String that is able to hold international (UTF-8) strings for the user interface.
Definition: uistring.h:121
uiString::emptyString
static const uiString & emptyString()
Definition: uistring.h:300
mCreateImpl
#define mCreateImpl(donames, createfunc)
Definition: factory.h:315
Factory3Param::addCreator
void addCreator(Creator, const char *nm=nullptr, const uiString &usernm=uiString::emptyString())
Definition: factory.h:401
perthreadrepos.h
FactoryBase::addNames
void addNames(const char *, const uiString &)
FactoryBase::setDefaultName
void setDefaultName(int idx)
FactoryBase::errmsgs_
StaticStringManager errmsgs_
Definition: factory.h:61
Factory1Param
Generalized static factory that can deliver instances of T, when a variable is needed in the creation...
Definition: factory.h:189
create
static uiHor3DInterpol * create(uiParent *)
Factory2Param::create
T * create(const char *nm, P0, P1, bool chknm=true) const
Definition: factory.h:393
Factory3Param::create
T * create(const char *nm, P0, P1, P2, bool chknm=true) const
Definition: factory.h:409
TypeSet< Creator >

Generated at for the OpendTect seismic interpretation project. Copyright (C): dGB Beheer B.V. 1995-2021