blob: a18b131c5aaf1ac462cb81dc524ed380018fbf00 [file] [log] [blame]
David Reissea2cba82009-03-30 21:35:00 +00001/*
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 */
Mark Sleee9ce01c2007-05-16 02:29:53 +000019
Mark Slee31985722006-05-24 21:45:31 +000020#ifndef T_STRUCT_H
21#define T_STRUCT_H
22
23#include <vector>
24#include <string>
25
26#include "t_type.h"
Mark Sleee8540632006-05-30 09:24:40 +000027#include "t_field.h"
Mark Slee31985722006-05-24 21:45:31 +000028
Mark Sleef0712dc2006-10-25 19:03:57 +000029// Forward declare that puppy
30class t_program;
31
Mark Sleef5377b32006-10-10 01:42:59 +000032/**
33 * A struct is a container for a set of member fields that has a name. Structs
34 * are also used to implement exception types.
35 *
Mark Sleef5377b32006-10-10 01:42:59 +000036 */
Mark Slee31985722006-05-24 21:45:31 +000037class t_struct : public t_type {
38 public:
Mark Sleef0712dc2006-10-25 19:03:57 +000039 t_struct(t_program* program) :
40 t_type(program),
Mark Slee782abbb2007-01-19 00:17:02 +000041 is_xception_(false),
David Reissf84b3602007-09-17 21:16:32 +000042 xsd_all_(false) {}
Mark Sleeb15a68b2006-06-07 06:46:24 +000043
Mark Sleef0712dc2006-10-25 19:03:57 +000044 t_struct(t_program* program, const std::string& name) :
45 t_type(program, name),
Mark Slee782abbb2007-01-19 00:17:02 +000046 is_xception_(false),
David Reissf84b3602007-09-17 21:16:32 +000047 xsd_all_(false) {}
Mark Slee31985722006-05-24 21:45:31 +000048
Mark Slee9cb7c612006-09-01 22:17:45 +000049 void set_name(const std::string& name) {
50 name_ = name;
51 }
52
Mark Slee9cb7c612006-09-01 22:17:45 +000053 void set_xception(bool is_xception) {
54 is_xception_ = is_xception;
55 }
Mark Sleee8540632006-05-30 09:24:40 +000056
Mark Slee782abbb2007-01-19 00:17:02 +000057 void set_xsd_all(bool xsd_all) {
58 xsd_all_ = xsd_all;
59 }
60
61 bool get_xsd_all() const {
62 return xsd_all_;
63 }
64
Mark Slee9cb7c612006-09-01 22:17:45 +000065 void append(t_field* elem) {
66 members_.push_back(elem);
67 }
Mark Sleee8540632006-05-30 09:24:40 +000068
Mark Slee9cb7c612006-09-01 22:17:45 +000069 const std::vector<t_field*>& get_members() {
70 return members_;
71 }
72
73 bool is_struct() const {
74 return !is_xception_;
75 }
76
77 bool is_xception() const {
78 return is_xception_;
79 }
Mark Slee31985722006-05-24 21:45:31 +000080
David Reiss18bf22d2007-08-28 20:49:17 +000081 virtual std::string get_fingerprint_material() const {
82 std::string rv = "{";
83 std::vector<t_field*>::const_iterator m_iter;
84 for (m_iter = members_.begin(); m_iter != members_.end(); ++m_iter) {
David Reiss6ce97e32007-08-30 23:18:31 +000085 rv += (*m_iter)->get_fingerprint_material();
David Reiss18bf22d2007-08-28 20:49:17 +000086 rv += ";";
87 }
88 rv += "}";
89 return rv;
90 }
91
David Reiss9885c682007-08-30 23:12:37 +000092 virtual void generate_fingerprint() {
93 t_type::generate_fingerprint();
94 std::vector<t_field*>::const_iterator m_iter;
95 for (m_iter = members_.begin(); m_iter != members_.end(); ++m_iter) {
David Reiss6ce97e32007-08-30 23:18:31 +000096 (*m_iter)->get_type()->generate_fingerprint();
David Reiss18bf22d2007-08-28 20:49:17 +000097 }
98 }
99
Mark Slee6f9ac3f2007-11-28 22:28:13 +0000100 bool validate_field(t_field* field) {
101 int key = field->get_key();
102 std::vector<t_field*>::const_iterator m_iter;
103 for (m_iter = members_.begin(); m_iter != members_.end(); ++m_iter) {
104 if ((*m_iter)->get_key() == key) {
105 return false;
106 }
107 }
108 return true;
109 }
110
Mark Slee31985722006-05-24 21:45:31 +0000111 private:
David Reiss18bf22d2007-08-28 20:49:17 +0000112
Mark Sleee8540632006-05-30 09:24:40 +0000113 std::vector<t_field*> members_;
Mark Slee9cb7c612006-09-01 22:17:45 +0000114 bool is_xception_;
Mark Slee782abbb2007-01-19 00:17:02 +0000115
116 bool xsd_all_;
Mark Slee31985722006-05-24 21:45:31 +0000117};
118
119#endif