OpendTect  6.3
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 ________________________________________________________________________
11 
12 -*/
13 
14 #include "basicmod.h"
15 #include "iopar.h"
16 #include "uistring.h"
17 #include "bufstringset.h"
18 
19 #include "namedobj.h"
20 
44 mExpClass(Basic) EnumDef : public NamedObject
45 {
46 public:
47  EnumDef();
48  EnumDef(const char* nm,const char* s[]);
49  bool isValidKey(const char*) const;
50  int indexOf(const char* s) const;
51  int indexOf(int enumval) const;
52  int getEnumValForIndex(int) const;
53  const char* getKeyForIndex(int i) const;
54  uiString getUiStringForIndex(int i) const;
55  void setUiStringForIndex(int,const uiString&);
56  const BufferStringSet& keys() const { return keys_; }
57  const uiStringSet& strings() const { return uistrings_; }
58 
59  const char* getIconFileForIndex(int idx) const;
60  void setIconFileForIndex(int idx,const char*);
61 
62  int size() const;
63 
64  //Expert use only!
65  void remove(const char* key);
66  void add(const char* key, const uiString&,
67  int enumval, const char* iconfile);
68 
69 protected:
70  void fillUiStrings();
75 public:
76  //Legacy
77  mDeprecated bool isValidName(const char* key) const;
78  mDeprecated const char* convert(int idx) const;
79  mDeprecated int convert(const char* txt) const;
80 };
81 
82 template <class ENUM>
83 mClass(Basic) EnumDefImpl : public EnumDef
85 public:
86  EnumDefImpl(const char* nm,const char* s[]);
87  bool parse(const char* txt,ENUM& res) const;
88  bool parse(const IOPar& par,const char* key,ENUM& res) const;
89  ENUM parse(const char* txt) const;
90  ENUM getEnumForIndex(int idx) const;
91  const char* getKey(ENUM theenum) const;
92  uiString toUiString(ENUM theenum) const;
93 private:
94  void init();
95 public:
96  //Legacy
97  mDeprecated const char*
98  toString(ENUM theenum) const { return getKey(theenum); }
99 };
100 
101 
188 #define mDeclareEnumUtils(enm) \
189 public: \
190  static const EnumDefImpl<enm>& enm##Def(); \
191  static mDeprecated const char** enm##Names();\
192  static mDeprecated bool parseEnum##enm(const char*,enm&); /*legacy */ \
193  static mDeprecated bool parseEnum(const char*,enm&); \
194  static mDeprecated bool parseEnum(const IOPar&,const char*,enm&); \
195  static mDeprecated enm parseEnum##enm(const char*); \
196  static const char* toString(enm); \
197  static uiString toUiString(enm); \
198  static mDeprecated const char* get##enm##String(enm); /*legacy */ \
199 private: \
200  static EnumDefImpl<enm>* enm##CreateDef(); \
201  static const char* enm##Keys_[]; \
202  static ConstPtrMan<EnumDefImpl<enm> > enm##Definition_; \
203 public:
204 
205 #define mDeclareNameSpaceEnumUtils(mod,enm) \
206  mExtern(mod) const EnumDefImpl<enm>& enm##Def(); \
207  mExtern(mod) mDeprecated const char** enm##Names();\
208  mExtern(mod) mDeprecated bool parseEnum(const IOPar&,const char*,enm&); \
209  mExtern(mod) mDeprecated bool parseEnum(const char*,enm&); \
210  mExtern(mod) mDeprecated bool parseEnum##enm(const char*,enm&); /*legacy */\
211  mExtern(mod) mDeprecated enm parseEnum##enm(const char*); \
212  mExtern(mod) const char* toString(enm); \
213  mExtern(mod) uiString toUiString(enm); \
214  mExtern(mod) mDeprecated const char* get##enm##String(enm); /*legacy */
215 
216 //Legacy
217 #define DeclareEnumUtils(enm) mDeclareEnumUtils(enm)
218 #define DeclareNameSpaceEnumUtils(mod,enm) \
219 mDeclareNameSpaceEnumUtils(mod,enm)
220 
221 #define _mDefineEnumUtils(prefix,enm,createfunc,prettynm) \
222 const EnumDefImpl<prefix::enm>& prefix::enm##Def() \
223 { return *enm##Definition_.createIfNull( createfunc ); } \
224 bool prefix::parseEnum##enm(const char* txt, prefix::enm& res ) \
225 { \
226  const bool isok = prefix::enm##Def().parse( txt, res ); \
227  if ( !isok ) res = (prefix::enm) 0; \
228  return isok; \
229 } \
230 bool prefix::parseEnum(const char* txt, prefix::enm& res ) \
231 { return prefix::enm##Def().parse( txt, res ); } \
232 bool prefix::parseEnum( const IOPar& par, const char* key, prefix::enm& res ) \
233 { return prefix::enm##Def().parse( par, key, res ); } \
234 prefix::enm prefix::parseEnum##enm(const char* txt) \
235 { return prefix::enm##Def().parse( txt ); } \
236 const char* prefix::get##enm##String( prefix::enm theenum ) \
237 { return prefix::toString( theenum ); } \
238 const char* prefix::toString( prefix::enm theenum ) \
239 { return enm##Def().getKey( theenum ); } \
240 uiString prefix::toUiString( prefix::enm theenum ) \
241 { return enm##Def().toUiString( theenum ); } \
242 
243 
244 #define mDefineEnumUtils(clss,enm,prettynm) \
245 EnumDefImpl<clss::enm>* clss::enm##CreateDef() \
246 { return new EnumDefImpl<clss::enm>( prettynm, clss::enm##Keys_ ); } \
247 const char** clss::enm##Names() { return clss::enm##Keys_ ; } \
248 ConstPtrMan<EnumDefImpl<clss::enm> > clss::enm##Definition_ = 0; \
249 _mDefineEnumUtils( clss, enm, clss::enm##CreateDef, prettynm ); \
250 const char* clss::enm##Keys_[] =
251 
252 #define mDefineNameSpaceEnumUtils(nmspc,enm,prettynm) \
253 extern const char* nmspc##enm##Keys_[]; \
254 static EnumDefImpl<nmspc::enm>* nmspc##enm##CreateDef() \
255 { return new EnumDefImpl<nmspc::enm>( prettynm, nmspc##enm##Keys_ ); } \
256 const char** nmspc::enm##Names() { return nmspc##enm##Keys_; } \
257 static ConstPtrMan<EnumDefImpl<nmspc::enm> > enm##Definition_ = 0; \
258 _mDefineEnumUtils( nmspc, enm, nmspc##enm##CreateDef, prettynm );\
259 const char* nmspc##enm##Keys_[] =
260 
261 //Legacy
262 #define DefineEnumNames(clss,enm,deflen,prettynm) \
263 mDefineEnumUtils(clss,enm,prettynm)
264 #define DefineNameSpaceEnumNames(nmspc,enm,deflen,prettynm) \
265 mDefineNameSpaceEnumUtils(nmspc,enm,prettynm)
266 #define mEnumTr(str) tr(str)
267 
268 template <class ENUM> inline
269 EnumDefImpl<ENUM>::EnumDefImpl( const char* nm, const char* nms[] )
270  : EnumDef( nm, nms )
271 {
272  init();
273  if ( uistrings_.size()!=size() )
274  {
275  pErrMsg( "Wrong number of uistrings" );
276  }
277 
278  for ( int idx=uistrings_.size(); idx<size(); idx++ )
279  uistrings_ += ::toUiString( keys_.get(idx) );
280 
281  if ( iconfiles_.size() && iconfiles_.size()!=size() )
282  {
283  pErrMsg( "Wrong number of iconfiles" );
284  }
285 }
286 
287 template <class ENUM> inline
288 bool EnumDefImpl<ENUM>::parse(const char* txt, ENUM& res ) const
289 {
290  const int idx = isValidKey( txt )
291  ? indexOf( txt )
292  : -1;
293  if ( idx<0 )
294  return false;
295 
296  res = (ENUM) enums_[idx];
297  return true;
298 }
299 
300 
301 template <class ENUM> inline
302 bool EnumDefImpl<ENUM>::parse( const IOPar& par, const char* key,
303  ENUM& res ) const
304 {
305  const char* val = par.find( key );
306  return parse( val, res );
307 }
308 
309 
310 template <class ENUM> inline
312 {
313  return (ENUM) enums_[idx];
314 }
315 
316 
317 template <class ENUM> inline
318 ENUM EnumDefImpl<ENUM>::parse(const char* txt) const
319 {
320  return getEnumForIndex( indexOf( txt ) );
321 }
322 
323 
324 template <class ENUM> inline
325 const char* EnumDefImpl<ENUM>::getKey( ENUM theenum ) const
326 {
327  if ( !size() )
328  return 0;
329 
330  const int idx = enums_.indexOf( (int) theenum );
331  return keys_.get(idx>=0?idx:0).buf();
332 }
333 
334 
335 template <class ENUM> inline
337 {
338  const int idx = enums_.indexOf( (int) theenum );
339  return getUiStringForIndex( idx );
340 }
341 
342 
343 template <class ENUM> inline
345 {
346  fillUiStrings();
347 }
#define mExpClass(module)
Definition: commondefs.h:157
#define mODTextTranslationClass(clss)
Definition: uistring.h:37
int size() const
void fillUiStrings()
BufferStringSet iconfiles_
Definition: enums.h:74
bool init()
BufferString & get(size_type idx)
Definition: bufstringset.h:49
Definition: uistring.h:88
Set of BufferString objects.
Definition: bufstringset.h:25
ObjectSet< T >::size_type indexOf(const ObjectSet< T > &os, const S &val)
Locate object in set.
Definition: objectset.h:173
int indexOf(const char *s) const
Definition: enums.h:83
const char * getKey(ENUM theenum) const
Definition: enums.h:325
const BufferStringSet & keys() const
Definition: enums.h:56
bool isValidKey(const char *) const
size_type size() const
Definition: uistring.h:250
Generalized set of parameters of the keyword-value type.
Definition: iopar.h:53
ENUM getEnumForIndex(int idx) const
Definition: enums.h:311
const char * toString(ENUM theenum) const
Definition: enums.h:98
const char * find(const char *) const
returns null if not found
const uiStringSet & strings() const
Definition: enums.h:57
uiString getUiStringForIndex(int i) const
uiStringSet uistrings_
Definition: enums.h:71
uiString toUiString(const DBKey &ky)
Definition: dbkey.h:117
void init()
Definition: enums.h:344
const char * buf() const
Definition: odstring.h:45
#define mDeprecated
Definition: plfdefs.h:213
T convert(Type inptyp, T val, Type outtyp)
Definition: angles.h:74
object with a name.
Definition: namedobj.h:20
uiString toUiString(ENUM theenum) const
Definition: enums.h:336
TypeSet< int > enums_
Definition: enums.h:73
Definition: uistring.h:235
size_type size() const
Definition: bufstringset.h:37
BufferStringSet keys_
Definition: enums.h:72
bool parse(const char *txt, ENUM &res) const
Definition: enums.h:288
#define mClass(module)
Definition: commondefs.h:161
#define pErrMsg(msg)
Usual access point for programmer error messages.
Definition: errmsg.h:34
virtual size_type indexOf(T, bool forward=true, size_type start=-1) const
Definition: typeset.h:332
Holds data pertinent to a certain enum. It does not know the enum values themselves, but treat them as integers.
Definition: enums.h:44
EnumDefImpl(const char *nm, const char *s[])
Definition: enums.h:269

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