18393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius/* 28393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius****************************************************************************** 38393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius* 4fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* Copyright (C) 2012,2014 International Business Machines 58393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius* Corporation and others. All Rights Reserved. 68393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius* 78393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius****************************************************************************** 88393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius*/ 98393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 108393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius/** 118393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * \file 128393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * \brief C++: internal template EnumSet<> 138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius */ 148393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#ifndef ENUMSET_H 168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#define ENUMSET_H 178393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "unicode/utypes.h" 198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 208393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#if U_SHOW_CPLUSPLUS_API 218393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 228393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusU_NAMESPACE_BEGIN 238393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 24fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius/* Can't use #ifndef U_HIDE_INTERNAL_API for the entire EnumSet class, needed in .h file declarations */ 258393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius/** 268393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * enum bitset for boolean fields. Similar to Java EnumSet<>. 27fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * Needs to range check. Used for private instance variables. 288393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * @internal 298393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius */ 308393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliustemplate<typename T, uint32_t minValue, uint32_t limitValue> 318393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusclass EnumSet { 328393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliuspublic: 338393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius inline EnumSet() : fBools(0) {} 348393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius inline EnumSet(const EnumSet<T,minValue,limitValue>& other) : fBools(other.fBools) {} 358393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius inline ~EnumSet() {} 36fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#ifndef U_HIDE_INTERNAL_API 378393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius inline void clear() { fBools=0; } 388393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius inline void add(T toAdd) { set(toAdd, 1); } 398393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius inline void remove(T toRemove) { set(toRemove, 0); } 408393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius inline int32_t contains(T toCheck) const { return get(toCheck); } 418393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius inline void set(T toSet, int32_t v) { fBools=(fBools&(~flag(toSet)))|(v?(flag(toSet)):0); } 428393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius inline int32_t get(T toCheck) const { return (fBools & flag(toCheck))?1:0; } 438393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius inline UBool isValidEnum(T toCheck) const { return (toCheck>=minValue&&toCheck<limitValue); } 448393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius inline UBool isValidValue(int32_t v) const { return (v==0||v==1); } 458393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius inline const EnumSet<T,minValue,limitValue>& operator=(const EnumSet<T,minValue,limitValue>& other) { 468393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius fBools = other.fBools; 478393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return *this; 488393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 498393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 508393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius inline uint32_t getAll() const { 518393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return fBools; 528393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 53fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif /* U_HIDE_INTERNAL_API */ 548393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 558393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusprivate: 568393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius inline uint32_t flag(T toCheck) const { return (1<<(toCheck-minValue)); } 578393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusprivate: 588393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius uint32_t fBools; 598393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius}; 608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusU_NAMESPACE_END 628393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 638393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#endif /* U_SHOW_CPLUSPLUS_API */ 648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#endif /* ENUMSET_H */ 65