OpendTect  6.6
enums.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: 4-2-1994
9  Contents: Enum <--> string conversion
10  RCS: $Id$
11 ________________________________________________________________________
12 
13 -*/
14 
15 #include "basicmod.h"
16 #include "iopar.h"
17 #include "uistring.h"
18 #include "bufstringset.h"
19 
20 #include "namedobj.h"
21 
44 mExpClass(Basic) EnumDef : public NamedObject
45 {
46 public:
48  EnumDef(const char* nm,const char* s[],
49  short nrs=0);
50  bool isValidKey(const char*) const;
51  int indexOf(const char* s) const;
52  int indexOf(int enumval) const;
53  int getEnumValForIndex(int) const;
54  const char* getKeyForIndex(int i) const;
56  void setUiStringForIndex(int,const uiString&);
57  const BufferStringSet& keys() const { return keys_; }
58  const uiStringSet& strings() const { return uistrings_; }
59 
60  const char* getIconFileForIndex(int idx) const;
61  void setIconFileForIndex(int idx,const char*);
62 
63  int size() const;
64 
65  //Expert use only!
66  void remove(const char* key);
67  void add(const char* key, const uiString&,
68  int enumval, const char* iconfile);
69 
70 protected:
71  void fillUiStrings();
76 public:
77  //Legacy
78  bool isValidName(const char* key) const
79  { return isValidKey(key); }
80  const char* convert(int idx) const { return getKeyForIndex(idx); }
81  int convert(const char* txt) const { return indexOf(txt); }
82 };
83 
84 template <class ENUM>
85 mClass(Basic) EnumDefImpl : public EnumDef
87 public:
88  EnumDefImpl(const char* nm,const char* s[],short nrs=0);
89  bool parse(const char* txt,ENUM& res) const;
90  bool parse(const IOPar& par,const char* key,ENUM& res) const;
91  ENUM parse(const char* txt) const;
92  ENUM getEnumForIndex(int idx) const;
93  const char* getKey(ENUM theenum) const;
94  uiString toUiString(ENUM theenum) const;
95 private:
96  void init();
97 public:
98  //Legacy
99  const char* toString(ENUM theenum) const { return getKey(theenum); }
100 
101 };
102 
103 
257 #define mDeclareEnumUtils(enm) \
258 public: \
259  static const EnumDefImpl<enm>& enm##Def(); \
260  static const char** enm##Names();\
261  static bool parseEnum##enm(const char*,enm&); /*legacy */ \
262  static bool parseEnum(const char*,enm&); \
263  static bool parseEnum(const IOPar&,const char*,enm&); \
264  static enm parseEnum##enm(const char*); \
265  static const char* toString(enm); \
266  static uiString toUiString(enm); \
267  static const char* get##enm##String(enm); /*legacy */ \
268 protected: \
269  static const char* enm##Keys_[]; \
270  static ConstPtrMan<EnumDefImpl<enm> > enm##Definition_; \
271 public:
272 
273 #define mDeclareNameSpaceEnumUtils(mod,enm) \
274  mExtern(mod) const EnumDefImpl<enm>& enm##Def(); \
275  mExtern(mod) const char** enm##Names();\
276  extern const char* enm##Keys_[]; \
277  mExtern(mod) bool parseEnum(const IOPar&,const char*,enm&); \
278  mExtern(mod) bool parseEnum(const char*,enm&); \
279  mExtern(mod) bool parseEnum##enm(const char*,enm&); /*legacy */ \
280  mExtern(mod) enm parseEnum##enm(const char*); \
281  mExtern(mod) const char* toString(enm); \
282  mExtern(mod) uiString toUiString(enm); \
283  mExtern(mod) const char* get##enm##String(enm); /*legacy */
284 
285 #define _DefineEnumNames(prefix,enm,deflen,prettynm) \
286 const EnumDefImpl<prefix::enm>& prefix::enm##Def() \
287 { \
288  if ( !enm##Definition_ ) \
289  { \
290  EnumDefImpl<prefix::enm>* newdef = \
291  new EnumDefImpl<prefix::enm>(prettynm,prefix::enm##Keys_,deflen); \
292  enm##Definition_.setIfNull( newdef,true ); \
293  } \
294  \
295  return *enm##Definition_; \
296 } \
297 const char** prefix::enm##Names() \
298 { return prefix::enm##Keys_; } \
299 bool prefix::parseEnum##enm(const char* txt, prefix::enm& res ) \
300 { \
301  const bool isok = prefix::parseEnum( txt, res ); \
302  if ( !isok ) res = (prefix::enm) 0; \
303  return isok; \
304 } \
305 bool prefix::parseEnum(const char* txt, prefix::enm& res ) \
306 { return prefix::enm##Def().parse( txt, res ); } \
307 bool prefix::parseEnum( const IOPar& par, const char* key, prefix::enm& res ) \
308 { return prefix::enm##Def().parse( par, key, res ); } \
309 prefix::enm prefix::parseEnum##enm(const char* txt) \
310 { return prefix::enm##Def().parse( txt ); } \
311 const char* prefix::get##enm##String( prefix::enm theenum ) \
312 { return prefix::toString( theenum ); } \
313 const char* prefix::toString( prefix::enm theenum ) \
314 { return enm##Def().getKey( theenum ); } \
315 uiString prefix::toUiString( prefix::enm theenum ) \
316 { return enm##Def().toUiString( theenum ); } \
317 const char* prefix::enm##Keys_[] =
318 
319 
320 #define DefineEnumNames(clss,enm,deflen,prettynm) \
321 ConstPtrMan<EnumDefImpl<clss::enm> > clss::enm##Definition_ = 0; \
322 _DefineEnumNames( clss, enm, deflen, prettynm )
323 
324 #define DefineNameSpaceEnumNames(nmspc,enm,deflen,prettynm) \
325 static ConstPtrMan<EnumDefImpl<nmspc::enm> > enm##Definition_ = 0; \
326 _DefineEnumNames( nmspc, enm, deflen, prettynm )
327 
328 //New Defs
329 #define mDefineEnumUtils(clss,enm,prettynm) \
330 DefineEnumNames(clss,enm,0,prettynm)
331 
332 #define mDefineNameSpaceEnumUtils(nmspc,enm,prettynm) \
333 DefineNameSpaceEnumNames(nmspc,enm,0,prettynm)
334 
335 //Legacy
336 #define DeclareEnumUtils(enm) mDeclareEnumUtils(enm)
337 #define DefineEnumUtils(clss,enm,prettynm) mDefineEnumUtils(clss,enm,prettynm)
338 #define DefineNameSpaceEnumUtils(nmspc,enm,prettynm) \
339 mDefineNameSpaceEnumUtils(nmspc,enm,prettynm)
340 #define DeclareNameSpaceEnumUtils(mod,enm) mDeclareNameSpaceEnumUtils(mod,enm)
341 
342 #define mEnumTr(str) tr(str)
343 
344 
345 template <class ENUM> inline
346 EnumDefImpl<ENUM>::EnumDefImpl( const char* nm, const char* nms[], short nrs )
347  : EnumDef( nm, nms, nrs )
348 {
349  init();
350  if ( !uistrings_.isEmpty() && uistrings_.size()!=size() )
351  {
352  pErrMsg( "Wrong number of uistrings" );
353  }
354 
355  for ( int idx=uistrings_.size(); idx<size(); idx++ )
356  uistrings_ += ::toUiString( keys_.get(idx) );
357 
358  if ( !iconfiles_.isEmpty() && iconfiles_.size()!=size() )
359  {
360  pErrMsg( "Wrong number of iconfiles" );
361  }
362 }
363 
364 template <class ENUM> inline
365 bool EnumDefImpl<ENUM>::parse(const char* txt, ENUM& res ) const
366 {
367  const int idx = isValidKey( txt )
368  ? indexOf( txt )
369  : -1;
370  if ( idx<0 )
371  return false;
372 
373  res = (ENUM) enums_[idx];
374  return true;
375 }
376 
377 
378 template <class ENUM> inline
379 bool EnumDefImpl<ENUM>::parse( const IOPar& par, const char* key,
380  ENUM& res ) const
381 {
382  const char* val = par.find( key );
383  return parse( val, res );
384 }
385 
386 
387 template <class ENUM> inline
389 {
390  return (ENUM) enums_[idx];
391 }
392 
393 
394 template <class ENUM> inline
395 ENUM EnumDefImpl<ENUM>::parse(const char* txt) const
396 {
397  return getEnumForIndex( indexOf( txt ) );
398 }
399 
400 
401 template <class ENUM> inline
402 const char* EnumDefImpl<ENUM>::getKey( ENUM theenum ) const
403 {
404  if ( !size() )
405  return 0;
406 
407  const int idx = enums_.indexOf( (int) theenum );
408  return keys_.get(idx>=0?idx:0).buf();
409 }
410 
411 
412 template <class ENUM> inline
414 {
415  const int idx = enums_.indexOf( (int) theenum );
416  return getUiStringForIndex( idx );
417 }
418 
419 
420 template <class ENUM> inline
422 {
423  fillUiStrings();
424 }
425 
426 
EnumDef::getKeyForIndex
const char * getKeyForIndex(int i) const
NamedObject
object with a name.
Definition: namedobj.h:42
EnumDef::EnumDef
EnumDef()
EnumDefImpl::toUiString
uiString toUiString(ENUM theenum) const
Definition: enums.h:413
EnumDef::uistrings_
uiStringSet uistrings_
Definition: enums.h:72
BufferStringSet::get
BufferString & get(idx_type idx)
Definition: bufstringset.h:57
EnumDef::indexOf
int indexOf(const char *s) const
uistring.h
uiStringSet
Definition: uistringset.h:23
EnumDef::keys_
BufferStringSet keys_
Definition: enums.h:73
BufferStringSet
Set of BufferString objects.
Definition: bufstringset.h:26
EnumDef::remove
void remove(const char *key)
EnumDef::EnumDef
EnumDef(const char *nm, const char *s[], short nrs=0)
mExpClass
#define mExpClass(module)
Definition: commondefs.h:177
EnumDef::setIconFileForIndex
void setIconFileForIndex(int idx, const char *)
namedobj.h
EnumDef::convert
const char * convert(int idx) const
Definition: enums.h:80
EnumDef::enums_
TypeSet< int > enums_
Definition: enums.h:74
EnumDef::size
int size() const
EnumDefImpl::parse
bool parse(const IOPar &par, const char *key, ENUM &res) const
Definition: enums.h:379
EnumDef::isValidName
bool isValidName(const char *key) const
Definition: enums.h:78
EnumDefImpl::getKey
const char * getKey(ENUM theenum) const
Definition: enums.h:402
mODTextTranslationClass
#define mODTextTranslationClass(clss)
Definition: uistring.h:40
EnumDef::setUiStringForIndex
void setUiStringForIndex(int, const uiString &)
EnumDef::strings
const uiStringSet & strings() const
Definition: enums.h:58
EnumDefImpl
Definition: enums.h:86
indexOf
BufferStringSet::idx_type indexOf(const BufferStringSet &, const char *)
mClass
#define mClass(module)
Definition: commondefs.h:181
EnumDef::indexOf
int indexOf(int enumval) const
EnumDefImpl::parse
bool parse(const char *txt, ENUM &res) const
Definition: enums.h:365
EnumDefImpl::getEnumForIndex
ENUM getEnumForIndex(int idx) const
Definition: enums.h:388
BufferStringSet::isEmpty
bool isEmpty() const
Definition: bufstringset.h:44
EnumDef
Holds data pertinent to a certain enum. It does not know the enum values themselves,...
Definition: enums.h:45
pErrMsg
#define pErrMsg(msg)
Usual access point for programmer error messages.
Definition: errmsg.h:37
EnumDef::convert
int convert(const char *txt) const
Definition: enums.h:81
EnumDefImpl::toString
const char * toString(ENUM theenum) const
Definition: enums.h:99
BufferStringSet::size
size_type size() const
Definition: bufstringset.h:43
EnumDef::fillUiStrings
void fillUiStrings()
EnumDef::keys
const BufferStringSet & keys() const
Definition: enums.h:57
EnumDef::iconfiles_
BufferStringSet iconfiles_
Definition: enums.h:75
bufstringset.h
EnumDefImpl::EnumDefImpl
EnumDefImpl(const char *nm, const char *s[], short nrs=0)
Definition: enums.h:346
IOPar::find
const char * find(const char *) const
returns null if not found
uiString
String that is able to hold international (UTF-8) strings for the user interface.
Definition: uistring.h:121
EnumDefImpl::parse
ENUM parse(const char *txt) const
Definition: enums.h:395
EnumDefImpl::init
void init()
Definition: enums.h:421
EnumDef::isValidKey
bool isValidKey(const char *) const
iopar.h
EnumDef::add
void add(const char *key, const uiString &, int enumval, const char *iconfile)
EnumDef::getIconFileForIndex
const char * getIconFileForIndex(int idx) const
EnumDef::getUiStringForIndex
uiString getUiStringForIndex(int i) const
EnumDef::getEnumValForIndex
int getEnumValForIndex(int) const
uiStringSet::size
size_type size() const
Definition: uistringset.h:41
IOPar
Generalized set of parameters of the keyword-value type.
Definition: iopar.h:55
TypeSet< int >
uiStringSet::isEmpty
bool isEmpty() const
Definition: uistringset.h:44

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