Enum.h 4.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /******************************************************************************
  2. Use 'Enum' to handle operating on C++ style enums.
  3. /******************************************************************************/
  4. struct Enum // Enum helper class !! Enum doesn't support manual value assigning, for example "enum SAMPLE_ENUM{ CUSTOM_VALUE=128 };" !!
  5. {
  6. struct Elm // Enum Element
  7. {
  8. Char8 name[64]; // element name
  9. UID id ; // element unique id
  10. Elm& set(C Str8 &name, C UID &id) {Set(T.name, name); T.id=id; return T;}
  11. };
  12. Char8 name[64]; // enum name
  13. // get
  14. C Mems<Elm>& elms ( )C {return _elms ;} // get enum elements
  15. C Elm & operator[](Int i)C {return _elms[i];} // get i-th enum element
  16. CChar8* elmName (Int i)C; // get i-th enum element name , null on fail (if index is out of range)
  17. C UID & elmID (Int i)C; // get i-th enum element ID , 'UIDZero' on fail (if index is out of range)
  18. UInt elmIDUInt(Int i)C; // get i-th enum element ID as UInt, 0 on fail (if index is out of range)
  19. Int find (CChar8 *name)C; // get index of enum element by specifying its 'name' , -1 on fail (if element was not found)
  20. Int find (CChar *name)C; // get index of enum element by specifying its 'name' , -1 on fail (if element was not found)
  21. Int find (C UID &id )C; // get index of enum element by specifying its 'id' , -1 on fail (if element was not found)
  22. Int findByIDUInt(UInt id )C; // get index of enum element by specifying its 'id' as UInt, -1 on fail (if element was not found)
  23. Int operator() (CChar8 *name)C; // get index of enum element by specifying its 'name' , Exit on fail (if element was not found)
  24. Int operator() (CChar *name)C; // get index of enum element by specifying its 'name' , Exit on fail (if element was not found)
  25. Int operator() (C UID &id )C; // get index of enum element by specifying its 'id' , Exit on fail (if element was not found)
  26. C UID & findID (CChar8 *name)C {return elmID (find(name));} // get ID of enum element by specifying its 'name', 'UIDZero' on fail (if element was not found)
  27. C UID & findID (CChar *name)C {return elmID (find(name));} // get ID of enum element by specifying its 'name', 'UIDZero' on fail (if element was not found)
  28. CChar8* findName(C UID &id )C {return elmName(find(id ));} // get name of enum element by specifying its 'id' , null on fail (if element was not found)
  29. C UID & getID (CChar8 *name)C {return elmID (T (name));} // get ID of enum element by specifying its 'name', Exit on fail (if element was not found)
  30. C UID & getID (CChar *name)C {return elmID (T (name));} // get ID of enum element by specifying its 'name', Exit on fail (if element was not found)
  31. CChar8* getName(C UID &id )C {return elmName(T (id ));} // get name of enum element by specifying its 'id' , Exit on fail (if element was not found)
  32. // manage
  33. Enum& create(C Str &name, C MemPtr<Elm> &elms); // create from custom elements
  34. // io
  35. void operator=(C Str &name) ; // load binary , Exit on fail
  36. Bool save ( File &f )C; // save binary , false on fail
  37. Bool load ( File &f ) ; // load binary , false on fail
  38. Bool save (C Str &name)C; // save binary , false on fail
  39. Bool load (C Str &name) ; // load binary , false on fail
  40. Bool saveH (C Str &name)C; // save text (C++ header style), false on fail
  41. #if EE_PRIVATE
  42. void sort();
  43. UInt* nameOrder()C {return _order ;} // get array of element indexes sorted by their name
  44. UInt* idOrder()C {return _order+elms().elms();} // get array of element indexes sorted by their id
  45. #endif
  46. Enum& del ( );
  47. ~Enum() {del ( );}
  48. Enum() {Zero(T);}
  49. Enum(C Enum &src); // create from 'src'
  50. Enum& operator=(C Enum &src); // create from 'src'
  51. private:
  52. UInt *_order;
  53. Mems<Elm> _elms ;
  54. };
  55. /******************************************************************************/
  56. extern Cache<Enum> Enums; // Enum Cache
  57. /******************************************************************************/
  58. #if EE_PRIVATE
  59. void ShutEnum();
  60. #endif
  61. inline Int Elms(C Enum &e) {return e.elms().elms();}
  62. /******************************************************************************/