THRIFT-236. Sort fields in id order during parsing
This effectively eliminates the notion of "IDL-order".
All structs have their fields sorted in increasing order of field id.
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@760201 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/parse/t_struct.h b/compiler/cpp/src/parse/t_struct.h
index a18b131..172a0f2 100644
--- a/compiler/cpp/src/parse/t_struct.h
+++ b/compiler/cpp/src/parse/t_struct.h
@@ -20,7 +20,9 @@
#ifndef T_STRUCT_H
#define T_STRUCT_H
+#include <algorithm>
#include <vector>
+#include <utility>
#include <string>
#include "t_type.h"
@@ -36,6 +38,8 @@
*/
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),
@@ -62,11 +66,19 @@
return xsd_all_;
}
- void append(t_field* elem) {
- members_.push_back(elem);
+ bool append(t_field* elem) {
+ typedef members_type::iterator iter_type;
+ std::pair<iter_type, iter_type> bounds = std::equal_range(
+ members_.begin(), members_.end(), elem, t_field::key_compare()
+ );
+ if (bounds.first != bounds.second) {
+ return false;
+ }
+ members_.insert(bounds.second, elem);
+ return true;
}
- const std::vector<t_field*>& get_members() {
+ const members_type& get_members() {
return members_;
}
@@ -80,7 +92,7 @@
virtual std::string get_fingerprint_material() const {
std::string rv = "{";
- std::vector<t_field*>::const_iterator m_iter;
+ members_type::const_iterator m_iter;
for (m_iter = members_.begin(); m_iter != members_.end(); ++m_iter) {
rv += (*m_iter)->get_fingerprint_material();
rv += ";";
@@ -91,26 +103,15 @@
virtual void generate_fingerprint() {
t_type::generate_fingerprint();
- std::vector<t_field*>::const_iterator m_iter;
+ members_type::const_iterator m_iter;
for (m_iter = members_.begin(); m_iter != members_.end(); ++m_iter) {
(*m_iter)->get_type()->generate_fingerprint();
}
}
- bool validate_field(t_field* field) {
- int key = field->get_key();
- std::vector<t_field*>::const_iterator m_iter;
- for (m_iter = members_.begin(); m_iter != members_.end(); ++m_iter) {
- if ((*m_iter)->get_key() == key) {
- return false;
- }
- }
- return true;
- }
-
private:
- std::vector<t_field*> members_;
+ members_type members_;
bool is_xception_;
bool xsd_all_;