summaryrefslogtreecommitdiff
path: root/compiler/cpp/src/parse/t_struct.h
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/cpp/src/parse/t_struct.h')
-rw-r--r--compiler/cpp/src/parse/t_struct.h127
1 files changed, 127 insertions, 0 deletions
diff --git a/compiler/cpp/src/parse/t_struct.h b/compiler/cpp/src/parse/t_struct.h
new file mode 100644
index 000000000..7980f803f
--- /dev/null
+++ b/compiler/cpp/src/parse/t_struct.h
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef T_STRUCT_H
+#define T_STRUCT_H
+
+#include <algorithm>
+#include <vector>
+#include <utility>
+#include <string>
+
+#include "t_type.h"
+#include "t_field.h"
+
+// Forward declare that puppy
+class t_program;
+
+/**
+ * A struct is a container for a set of member fields that has a name. Structs
+ * are also used to implement exception types.
+ *
+ */
+class t_struct : public t_type {
+ public:
+ typedef std::vector<t_field*> members_type;
+
+ t_struct(t_program* program) :
+ t_type(program),
+ is_xception_(false),
+ xsd_all_(false) {}
+
+ t_struct(t_program* program, const std::string& name) :
+ t_type(program, name),
+ is_xception_(false),
+ xsd_all_(false) {}
+
+ void set_name(const std::string& name) {
+ name_ = name;
+ }
+
+ void set_xception(bool is_xception) {
+ is_xception_ = is_xception;
+ }
+
+ void set_xsd_all(bool xsd_all) {
+ xsd_all_ = xsd_all;
+ }
+
+ bool get_xsd_all() const {
+ return xsd_all_;
+ }
+
+ bool append(t_field* elem) {
+ members_.push_back(elem);
+
+ typedef members_type::iterator iter_type;
+ std::pair<iter_type, iter_type> bounds = std::equal_range(
+ members_in_id_order_.begin(), members_in_id_order_.end(), elem, t_field::key_compare()
+ );
+ if (bounds.first != bounds.second) {
+ return false;
+ }
+ members_in_id_order_.insert(bounds.second, elem);
+ return true;
+ }
+
+ const members_type& get_members() {
+ return members_;
+ }
+
+ const members_type& get_sorted_members() {
+ return members_in_id_order_;
+ }
+
+ bool is_struct() const {
+ return !is_xception_;
+ }
+
+ bool is_xception() const {
+ return is_xception_;
+ }
+
+ virtual std::string get_fingerprint_material() const {
+ std::string rv = "{";
+ members_type::const_iterator m_iter;
+ for (m_iter = members_in_id_order_.begin(); m_iter != members_in_id_order_.end(); ++m_iter) {
+ rv += (*m_iter)->get_fingerprint_material();
+ rv += ";";
+ }
+ rv += "}";
+ return rv;
+ }
+
+ virtual void generate_fingerprint() {
+ t_type::generate_fingerprint();
+ members_type::const_iterator m_iter;
+ for (m_iter = members_in_id_order_.begin(); m_iter != members_in_id_order_.end(); ++m_iter) {
+ (*m_iter)->get_type()->generate_fingerprint();
+ }
+ }
+
+ private:
+
+ members_type members_;
+ members_type members_in_id_order_;
+ bool is_xception_;
+
+ bool xsd_all_;
+};
+
+#endif