Skip to content

Commit 22075e5

Browse files
authored
Merge pull request ClickHouse#37 from v5r/enum-iter
provide iterator for enum elements
2 parents 863930c + 22db72f commit 22075e5

File tree

3 files changed

+23
-2
lines changed

3 files changed

+23
-2
lines changed

clickhouse/types/types.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,4 +212,12 @@ bool EnumType::HasEnumValue(int16_t value) const {
212212
return type_->enum_->value_to_name.find(value) != type_->enum_->value_to_name.end();
213213
}
214214

215+
EnumType::ValueToNameIterator EnumType::BeginValueToName() const {
216+
return type_->enum_->value_to_name.begin();
217+
}
218+
219+
EnumType::ValueToNameIterator EnumType::EndValueToName() const {
220+
return type_->enum_->value_to_name.end();
221+
}
222+
215223
}

clickhouse/types/types.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,10 @@ class Type {
9898
};
9999

100100
struct EnumImpl {
101-
std::map<int16_t, std::string> value_to_name;
102-
std::map<std::string, int16_t> name_to_value;
101+
using ValueToNameType = std::map<int16_t, std::string>;
102+
using NameToValueType = std::map<std::string, int16_t>;
103+
ValueToNameType value_to_name;
104+
NameToValueType name_to_value;
103105
};
104106

105107
friend class EnumType;
@@ -128,6 +130,11 @@ class EnumType {
128130
bool HasEnumName(const std::string& name) const;
129131
bool HasEnumValue(int16_t value) const;
130132

133+
/// Iterator for enum elements.
134+
using ValueToNameIterator = Type::EnumImpl::ValueToNameType::const_iterator;
135+
ValueToNameIterator BeginValueToName() const;
136+
ValueToNameIterator EndValueToName() const;
137+
131138
private:
132139
TypeRef type_;
133140
};

ut/types_ut.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,10 @@ TEST(TypesCase, EnumTypes) {
5858
ASSERT_FALSE(enum16.HasEnumName("Black"));
5959
ASSERT_EQ(enum16.GetEnumName(2), "Red");
6060
ASSERT_EQ(enum16.GetEnumValue("Green"), 1);
61+
62+
ASSERT_EQ(std::distance(enum16.BeginValueToName(), enum16.EndValueToName()), 3u);
63+
ASSERT_EQ((*enum16.BeginValueToName()).first, 1);
64+
ASSERT_EQ((*enum16.BeginValueToName()).second, "Green");
65+
ASSERT_EQ((*(++enum16.BeginValueToName())).first, 2);
66+
ASSERT_EQ((*(++enum16.BeginValueToName())).second, "Red");
6167
}

0 commit comments

Comments
 (0)