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