Line data Source code
1 : /* 2 : * Licensed to the Apache Software Foundation (ASF) under one 3 : * or more contributor license agreements. See the NOTICE file 4 : * distributed with this work for additional information 5 : * regarding copyright ownership. The ASF licenses this file 6 : * to you under the Apache License, Version 2.0 (the 7 : * "License"); you may not use this file except in compliance 8 : * with the License. You may obtain a copy of the License at 9 : * 10 : * http://www.apache.org/licenses/LICENSE-2.0 11 : * 12 : * Unless required by applicable law or agreed to in writing, 13 : * software distributed under the License is distributed on an 14 : * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 : * KIND, either express or implied. See the License for the 16 : * specific language governing permissions and limitations 17 : * under the License. 18 : */ 19 : 20 : #ifndef T_ENUM_H 21 : #define T_ENUM_H 22 : 23 : #include "t_enum_value.h" 24 : #include <vector> 25 : 26 : /** 27 : * An enumerated type. A list of constant objects with a name for the type. 28 : * 29 : */ 30 : class t_enum : public t_type { 31 : public: 32 1010 : t_enum(t_program* program) : 33 1010 : t_type(program) {} 34 : 35 1010 : void set_name(const std::string& name) { 36 1010 : name_ = name; 37 1010 : } 38 : 39 8042 : void append(t_enum_value* constant) { 40 8042 : constants_.push_back(constant); 41 8042 : } 42 : 43 9748 : const std::vector<t_enum_value*>& get_constants() { 44 9748 : return constants_; 45 : } 46 : 47 3029 : t_enum_value* get_constant_by_name(const std::string name) { 48 3029 : const std::vector<t_enum_value*>& enum_values = get_constants(); 49 3029 : std::vector<t_enum_value*>::const_iterator c_iter; 50 27812 : for (c_iter = enum_values.begin(); c_iter != enum_values.end(); ++c_iter) { 51 27812 : if ((*c_iter)->get_name() == name) { 52 3029 : return *c_iter; 53 : } 54 : } 55 0 : return NULL; 56 : } 57 : 58 0 : t_enum_value* get_constant_by_value(int64_t value) { 59 0 : const std::vector<t_enum_value*>& enum_values = get_constants(); 60 0 : std::vector<t_enum_value*>::const_iterator c_iter; 61 0 : for (c_iter = enum_values.begin(); c_iter != enum_values.end(); ++c_iter) { 62 0 : if ((*c_iter)->get_value() == value) { 63 0 : return *c_iter; 64 : } 65 : } 66 0 : return NULL; 67 : } 68 : 69 16854 : bool is_enum() const { 70 16854 : return true; 71 : } 72 : 73 752 : virtual std::string get_fingerprint_material() const { 74 752 : return "enum"; 75 : } 76 : 77 1010 : void resolve_values() { 78 1010 : const std::vector<t_enum_value*>& enum_values = get_constants(); 79 1010 : std::vector<t_enum_value*>::const_iterator c_iter; 80 1010 : int lastValue = -1; 81 9052 : for (c_iter = enum_values.begin(); c_iter != enum_values.end(); ++c_iter) { 82 8042 : if (! (*c_iter)->has_value()) { 83 6518 : (*c_iter)->set_value(++lastValue); 84 : } else { 85 1524 : lastValue = (*c_iter)->get_value(); 86 : } 87 : } 88 1010 : } 89 : 90 : private: 91 : std::vector<t_enum_value*> constants_; 92 : }; 93 : 94 : #endif