/TGame/TUtil/Data/Flags.h

http://awoe.googlecode.com/ · C Header · 143 lines · 122 code · 21 blank · 0 comment · 7 complexity · fe036643438cf31100d9068cc7cb35b2 MD5 · raw file

  1. #ifndef __DATA_UTIL_FLAGS__
  2. #define __DATA_UTIL_FLAGS__
  3. namespace woe
  4. {
  5. template<int length>
  6. class Flags
  7. {
  8. static const short len_int = (length>>5)+1;
  9. static const short len_cha = (length>>3)+1;
  10. public:
  11. Flags(const char& val = 0)
  12. {
  13. memset((void*)&_data, val, sizeof(_data));
  14. }
  15. Flags(const Flags& flg)
  16. {
  17. memcpy((void*)&_data, (void*)&flg._data, sizeof(_data));
  18. }
  19. Flags& operator = (const Flags& flg)
  20. {
  21. memcpy((void*)&_data, (void*)&flg._data, sizeof(_data));
  22. return *this;
  23. }
  24. bool set(const int * val)
  25. {
  26. memcpy((void*)&_data, (void*)val, sizeof(_data));
  27. return true;
  28. }
  29. bool set(const char * val)
  30. {
  31. memcpy((void*)&_data, (void*)val, sizeof(_data));
  32. return true;
  33. }
  34. bool set(const short& idx, const int& val)
  35. {
  36. if (idx<len_int)
  37. {
  38. _data._i[idx] = val;
  39. return true;
  40. }
  41. else
  42. {
  43. return false;
  44. }
  45. }
  46. bool set(const short& idx, const char& val)
  47. {
  48. if (idx<len_cha)
  49. {
  50. _data._c[idx] = val;
  51. return true;
  52. }
  53. else
  54. {
  55. return false;
  56. }
  57. }
  58. bool get(const short& idx, int& val)const
  59. {
  60. if (idx<len_int)
  61. {
  62. val = _data._i[idx];
  63. return true;
  64. }
  65. else
  66. {
  67. return false;
  68. }
  69. }
  70. bool get(const short& idx, char& val)const
  71. {
  72. if (idx<len_cha)
  73. {
  74. val = _data._c[idx];
  75. return true;
  76. }
  77. else
  78. {
  79. return false;
  80. }
  81. }
  82. void setFlg(const short& idx)
  83. {
  84. short idx_b = idx>>3;
  85. short flg = 1<< (idx&7);
  86. if (idx_b<len_cha)
  87. {
  88. _data._c[idx_b] |= flg;
  89. }
  90. }
  91. void clrFlg(const short& idx)
  92. {
  93. short idx_b = idx>>3;
  94. short flg = ~( 1<< (idx&7) );
  95. if (idx_b<len_cha)
  96. {
  97. _data._c[idx_b] &= flg;
  98. }
  99. }
  100. bool hasFlg(const short& idx) const
  101. {
  102. short idx_b = idx>>3;
  103. short flg = 1<< (idx&7);
  104. if (idx_b<len_cha)
  105. {
  106. return (_data._c[idx_b] & flg)!=0;
  107. }
  108. else
  109. {
  110. return false;
  111. }
  112. }
  113. protected:
  114. union Data
  115. {
  116. int _i[len_int];
  117. char _c[len_cha];
  118. };
  119. Data _data;
  120. };
  121. }
  122. #endif