OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
t_enum.h
Go to the documentation of this file.
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 
30 class t_enum : public t_type {
31  public:
32  t_enum(t_program* program) :
33  t_type(program) {}
34 
35  void set_name(const std::string& name) {
36  name_ = name;
37  }
38 
39  void append(t_enum_value* constant) {
40  constants_.push_back(constant);
41  }
42 
43  const std::vector<t_enum_value*>& get_constants() {
44  return constants_;
45  }
46 
47  t_enum_value* get_constant_by_name(const std::string name) {
48  const std::vector<t_enum_value*>& enum_values = get_constants();
49  std::vector<t_enum_value*>::const_iterator c_iter;
50  for (c_iter = enum_values.begin(); c_iter != enum_values.end(); ++c_iter) {
51  if ((*c_iter)->get_name() == name) {
52  return *c_iter;
53  }
54  }
55  return NULL;
56  }
57 
59  const std::vector<t_enum_value*>& enum_values = get_constants();
60  std::vector<t_enum_value*>::const_iterator c_iter;
61  for (c_iter = enum_values.begin(); c_iter != enum_values.end(); ++c_iter) {
62  if ((*c_iter)->get_value() == value) {
63  return *c_iter;
64  }
65  }
66  return NULL;
67  }
68 
69  bool is_enum() const {
70  return true;
71  }
72 
73  virtual std::string get_fingerprint_material() const {
74  return "enum";
75  }
76 
77  void resolve_values() {
78  const std::vector<t_enum_value*>& enum_values = get_constants();
79  std::vector<t_enum_value*>::const_iterator c_iter;
80  int lastValue = -1;
81  for (c_iter = enum_values.begin(); c_iter != enum_values.end(); ++c_iter) {
82  if (! (*c_iter)->has_value()) {
83  (*c_iter)->set_value(++lastValue);
84  } else {
85  lastValue = (*c_iter)->get_value();
86  }
87  }
88  }
89 
90  private:
91  std::vector<t_enum_value*> constants_;
92 };
93 
94 #endif
Definition: t_enum.h:30
Definition: t_type.h:48
bool is_enum() const
Definition: t_enum.h:69
t_enum(t_program *program)
Definition: t_enum.h:32
void set_name(const std::string &name)
Definition: t_enum.h:35
void append(t_enum_value *constant)
Definition: t_enum.h:39
void resolve_values()
Definition: t_enum.h:77
t_enum_value * get_constant_by_name(const std::string name)
Definition: t_enum.h:47
t_enum_value * get_constant_by_value(int64_t value)
Definition: t_enum.h:58
virtual std::string get_fingerprint_material() const
Definition: t_enum.h:73
const std::vector< t_enum_value * > & get_constants()
Definition: t_enum.h:43
std::vector< t_enum_value * > constants_
Definition: t_enum.h:91
std::string name_
Definition: t_type.h:201