Home | History | Annotate | Download | only in unicode
      1 /*
      2 ******************************************************************************
      3 *
      4 *   Copyright (C) 2012, International Business Machines
      5 *   Corporation and others.  All Rights Reserved.
      6 *
      7 ******************************************************************************
      8 */
      9 
     10 /**
     11  * \file
     12  * \brief C++: internal template EnumSet<>
     13  */
     14 
     15 #ifndef ENUMSET_H
     16 #define ENUMSET_H
     17 
     18 #include "unicode/utypes.h"
     19 
     20 #if U_SHOW_CPLUSPLUS_API
     21 
     22 U_NAMESPACE_BEGIN
     23 
     24 /**
     25  * enum bitset for boolean fields. Similar to Java EnumSet<>.
     26  * Needs to range check.
     27  * @internal
     28  */
     29 template<typename T, uint32_t minValue, uint32_t limitValue>
     30 class EnumSet {
     31 public:
     32     inline EnumSet() : fBools(0) {}
     33     inline EnumSet(const EnumSet<T,minValue,limitValue>& other) : fBools(other.fBools) {}
     34     inline ~EnumSet() {}
     35     inline void clear() { fBools=0; }
     36     inline void add(T toAdd) { set(toAdd, 1); }
     37     inline void remove(T toRemove) { set(toRemove, 0); }
     38     inline int32_t contains(T toCheck) const { return get(toCheck); }
     39     inline void set(T toSet, int32_t v) { fBools=(fBools&(~flag(toSet)))|(v?(flag(toSet)):0); }
     40     inline int32_t get(T toCheck) const { return (fBools & flag(toCheck))?1:0; }
     41     inline UBool isValidEnum(T toCheck) const {  return (toCheck>=minValue&&toCheck<limitValue); }
     42     inline UBool isValidValue(int32_t v) const { return (v==0||v==1); }
     43     inline const EnumSet<T,minValue,limitValue>& operator=(const EnumSet<T,minValue,limitValue>& other) {
     44         fBools = other.fBools;
     45         return *this;
     46     }
     47 
     48     inline uint32_t getAll() const {
     49         return fBools;
     50     }
     51 
     52 private:
     53     inline uint32_t flag(T toCheck) const { return (1<<(toCheck-minValue)); }
     54 private:
     55     uint32_t fBools;
     56 };
     57 
     58 U_NAMESPACE_END
     59 
     60 #endif /* U_SHOW_CPLUSPLUS_API */
     61 #endif /* ENUMSET_H */
     62