blob: dc7019eb03ee957dc30befaa2bd87aecc15ee7a0 [file] [log] [blame]
Mark Sleee9ce01c2007-05-16 02:29:53 +00001// 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/
6
Mark Slee31985722006-05-24 21:45:31 +00007#ifndef T_STRUCT_H
8#define T_STRUCT_H
9
10#include <vector>
11#include <string>
12
13#include "t_type.h"
Mark Sleee8540632006-05-30 09:24:40 +000014#include "t_field.h"
Mark Slee31985722006-05-24 21:45:31 +000015
Mark Sleef0712dc2006-10-25 19:03:57 +000016// Forward declare that puppy
17class t_program;
18
Mark Sleef5377b32006-10-10 01:42:59 +000019/**
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.
22 *
Mark Sleef5377b32006-10-10 01:42:59 +000023 */
Mark Slee31985722006-05-24 21:45:31 +000024class t_struct : public t_type {
25 public:
Mark Sleef0712dc2006-10-25 19:03:57 +000026 t_struct(t_program* program) :
27 t_type(program),
Mark Slee782abbb2007-01-19 00:17:02 +000028 is_xception_(false),
David Reissf84b3602007-09-17 21:16:32 +000029 xsd_all_(false) {}
Mark Sleeb15a68b2006-06-07 06:46:24 +000030
Mark Sleef0712dc2006-10-25 19:03:57 +000031 t_struct(t_program* program, const std::string& name) :
32 t_type(program, name),
Mark Slee782abbb2007-01-19 00:17:02 +000033 is_xception_(false),
David Reissf84b3602007-09-17 21:16:32 +000034 xsd_all_(false) {}
Mark Slee31985722006-05-24 21:45:31 +000035
Mark Slee9cb7c612006-09-01 22:17:45 +000036 void set_name(const std::string& name) {
37 name_ = name;
38 }
39
Mark Slee9cb7c612006-09-01 22:17:45 +000040 void set_xception(bool is_xception) {
41 is_xception_ = is_xception;
42 }
Mark Sleee8540632006-05-30 09:24:40 +000043
Mark Slee782abbb2007-01-19 00:17:02 +000044 void set_xsd_all(bool xsd_all) {
45 xsd_all_ = xsd_all;
46 }
47
48 bool get_xsd_all() const {
49 return xsd_all_;
50 }
51
Mark Slee9cb7c612006-09-01 22:17:45 +000052 void append(t_field* elem) {
53 members_.push_back(elem);
54 }
Mark Sleee8540632006-05-30 09:24:40 +000055
Mark Slee9cb7c612006-09-01 22:17:45 +000056 const std::vector<t_field*>& get_members() {
57 return members_;
58 }
59
60 bool is_struct() const {
61 return !is_xception_;
62 }
63
64 bool is_xception() const {
65 return is_xception_;
66 }
Mark Slee31985722006-05-24 21:45:31 +000067
David Reiss18bf22d2007-08-28 20:49:17 +000068 virtual std::string get_fingerprint_material() const {
69 std::string rv = "{";
70 std::vector<t_field*>::const_iterator m_iter;
71 for (m_iter = members_.begin(); m_iter != members_.end(); ++m_iter) {
David Reiss6ce97e32007-08-30 23:18:31 +000072 rv += (*m_iter)->get_fingerprint_material();
David Reiss18bf22d2007-08-28 20:49:17 +000073 rv += ";";
74 }
75 rv += "}";
76 return rv;
77 }
78
David Reiss9885c682007-08-30 23:12:37 +000079 virtual void generate_fingerprint() {
80 t_type::generate_fingerprint();
81 std::vector<t_field*>::const_iterator m_iter;
82 for (m_iter = members_.begin(); m_iter != members_.end(); ++m_iter) {
David Reiss6ce97e32007-08-30 23:18:31 +000083 (*m_iter)->get_type()->generate_fingerprint();
David Reiss18bf22d2007-08-28 20:49:17 +000084 }
85 }
86
Mark Slee6f9ac3f2007-11-28 22:28:13 +000087 bool validate_field(t_field* field) {
88 int key = field->get_key();
89 std::vector<t_field*>::const_iterator m_iter;
90 for (m_iter = members_.begin(); m_iter != members_.end(); ++m_iter) {
91 if ((*m_iter)->get_key() == key) {
92 return false;
93 }
94 }
95 return true;
96 }
97
Mark Slee31985722006-05-24 21:45:31 +000098 private:
David Reiss18bf22d2007-08-28 20:49:17 +000099
Mark Sleee8540632006-05-30 09:24:40 +0000100 std::vector<t_field*> members_;
Mark Slee9cb7c612006-09-01 22:17:45 +0000101 bool is_xception_;
Mark Slee782abbb2007-01-19 00:17:02 +0000102
103 bool xsd_all_;
Mark Slee31985722006-05-24 21:45:31 +0000104};
105
106#endif