ROSE 0.11.145.237
Rose/BitFlags.h
1#ifndef ROSE_BitFlags_H
2#define ROSE_BitFlags_H
3#include <RoseFirst.h>
4
5#include <rosePublicConfig.h>
6#include <boost/format.hpp>
7
8#ifdef ROSE_ENABLE_BOOST_SERIALIZATION
9#include <boost/serialization/access.hpp>
10#endif
11
12#include <Sawyer/Assert.h>
13#include <Sawyer/BitFlags.h>
14#include <vector>
15
16namespace Rose {
17
63template<typename E, typename V = int64_t>
64class BitFlags: public Sawyer::BitFlags<E, V> {
65public:
66 typedef E Enum;
67 typedef V Vector;
68
71 : Sawyer::BitFlags<E, V>(0) {}
72
74 BitFlags(Vector v) /*implicit*/
75 : Sawyer::BitFlags<E, V>(v) {}
76
77 BitFlags(Sawyer::BitFlags<E, V> bf) /*implicit*/
78 : Sawyer::BitFlags<E, V>(bf) {}
79
84 std::string toString(std::vector<int64_t> constants, const char*(*stringifier)(int64_t)) const {
85 std::string retval;
86 if (this->vector() != Vector(0)) {
87 Vector leftovers(0);
88 std::vector<Enum> members = this->split(constants, leftovers /*out*/);
89 for (Enum member: members) {
90 const char *name = stringifier(member);
91 ASSERT_not_null(name);
92 retval += std::string(retval.empty()?"":"|") + name;
93 }
94 if (leftovers != Vector(0))
95 retval += retval.empty()?"":"|" + (boost::format("%lx") % (unsigned long)leftovers).str();
96 } else {
97 if (const char* name = stringifier(0)) {
98 retval = name;
99 } else {
100 retval = "0";
101 }
102 }
103 return retval;
104 }
105};
106
107// Temporary construction helper useful before C++17
108template<class E>
109inline BitFlags<E>
110makeBitFlags(E enumMember) {
111 return BitFlags<E>(enumMember);
112}
113
114} // namespace
115
116#endif
Stores a vector of enum bit flags.
BitFlags()
Default constructor with all bits clear.
std::string toString(std::vector< int64_t > constants, const char *(*stringifier)(int64_t)) const
Convert to string.
BitFlags(Vector v)
Construct bit vector from value or bit.
Stores a vector of enum bit flags.
Vector vector() const
Current value of the bit vector.
std::vector< Enum > split() const
Split a vector into the individual bits values.
The ROSE library.
Sawyer support library.