r1377@opsdev009 (orig r71806): mcslee | 2007-11-28 14:28:13 -0800
[amiethrift.git] / compiler / cpp / src / parse / t_struct.h
blobbca51f6265c2ac3c73b4c2cfc0c89cf92763dbb0
1 // Copyright (c) 2006- Facebook
2 // Distributed under the Thrift Software License
3 //
4 // See accompanying file LICENSE or visit the Thrift site at:
5 // http://developers.facebook.com/thrift/
7 #ifndef T_STRUCT_H
8 #define T_STRUCT_H
10 #include <vector>
11 #include <string>
13 #include "t_type.h"
14 #include "t_field.h"
16 // Forward declare that puppy
17 class t_program;
19 /**
20 * A struct is a container for a set of member fields that has a name. Structs
21 * are also used to implement exception types.
23 * @author Mark Slee <mcslee@facebook.com>
25 class t_struct : public t_type {
26 public:
27 t_struct(t_program* program) :
28 t_type(program),
29 is_xception_(false),
30 xsd_all_(false) {}
32 t_struct(t_program* program, const std::string& name) :
33 t_type(program, name),
34 is_xception_(false),
35 xsd_all_(false) {}
37 void set_name(const std::string& name) {
38 name_ = name;
41 void set_xception(bool is_xception) {
42 is_xception_ = is_xception;
45 void set_xsd_all(bool xsd_all) {
46 xsd_all_ = xsd_all;
49 bool get_xsd_all() const {
50 return xsd_all_;
53 void append(t_field* elem) {
54 members_.push_back(elem);
57 const std::vector<t_field*>& get_members() {
58 return members_;
61 bool is_struct() const {
62 return !is_xception_;
65 bool is_xception() const {
66 return is_xception_;
69 virtual std::string get_fingerprint_material() const {
70 std::string rv = "{";
71 std::vector<t_field*>::const_iterator m_iter;
72 for (m_iter = members_.begin(); m_iter != members_.end(); ++m_iter) {
73 rv += (*m_iter)->get_fingerprint_material();
74 rv += ";";
76 rv += "}";
77 return rv;
80 virtual void generate_fingerprint() {
81 t_type::generate_fingerprint();
82 std::vector<t_field*>::const_iterator m_iter;
83 for (m_iter = members_.begin(); m_iter != members_.end(); ++m_iter) {
84 (*m_iter)->get_type()->generate_fingerprint();
88 bool validate_field(t_field* field) {
89 int key = field->get_key();
90 std::vector<t_field*>::const_iterator m_iter;
91 for (m_iter = members_.begin(); m_iter != members_.end(); ++m_iter) {
92 if ((*m_iter)->get_key() == key) {
93 return false;
96 return true;
99 private:
101 std::vector<t_field*> members_;
102 bool is_xception_;
104 bool xsd_all_;
107 #endif