From 7dc7f75e7c15061e3dd6bf133bb837f1d96cc6b3 Mon Sep 17 00:00:00 2001 From: Kevin Clark Date: Thu, 16 Oct 2008 19:15:20 +0000 Subject: [PATCH] rb: Create constants for field ids in generated structs [THRIFT-165] Author: Bryan Duxbury git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@705330 13f79535-47bb-0310-9956-ffa450edef68 --- compiler/cpp/src/generate/t_java_generator.cc | 6 -- compiler/cpp/src/generate/t_oop_generator.h | 5 ++ compiler/cpp/src/generate/t_rb_generator.cc | 17 ++++- lib/rb/benchmark/gen-rb/BenchmarkService.rb | 8 ++- lib/rb/spec/gen-rb/NonblockingService.rb | 25 ++++++-- lib/rb/spec/gen-rb/ThriftSpec_types.rb | 64 +++++++++++++------ 6 files changed, 91 insertions(+), 34 deletions(-) diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc index e8d9a95d..60ad2fb8 100644 --- a/compiler/cpp/src/generate/t_java_generator.cc +++ b/compiler/cpp/src/generate/t_java_generator.cc @@ -44,12 +44,6 @@ class t_java_generator : public t_oop_generator { out_dir_base_ = (bean_style_ ? "gen-javabean" : "gen-java"); } - string upcase_string(string original) { - std::transform(original.begin(), original.end(), original.begin(), (int(*)(int)) toupper); - return original; - } - - /** * Init and close methods */ diff --git a/compiler/cpp/src/generate/t_oop_generator.h b/compiler/cpp/src/generate/t_oop_generator.h index 8cba67fb..3150954d 100644 --- a/compiler/cpp/src/generate/t_oop_generator.h +++ b/compiler/cpp/src/generate/t_oop_generator.h @@ -35,6 +35,11 @@ class t_oop_generator : public t_generator { indent(out) << "}" << std::endl; } + std::string upcase_string(std::string original) { + std::transform(original.begin(), original.end(), original.begin(), (int(*)(int)) toupper); + return original; + } + /** * Generates a comment about this code being autogenerated, using C++ style * comments, which are also fair game in Java / PHP, yay! diff --git a/compiler/cpp/src/generate/t_rb_generator.cc b/compiler/cpp/src/generate/t_rb_generator.cc index acc87e6a..570b4a7f 100644 --- a/compiler/cpp/src/generate/t_rb_generator.cc +++ b/compiler/cpp/src/generate/t_rb_generator.cc @@ -67,6 +67,7 @@ class t_rb_generator : public t_oop_generator { void generate_rb_function_helpers(t_function* tfunction); void generate_rb_simple_constructor(std::ofstream& out, t_struct* tstruct); void generate_rb_simple_exception_constructor(std::ofstream& out, t_struct* tstruct); + void generate_field_constants (std::ofstream& out, t_struct* tstruct); void generate_accessors (std::ofstream& out, t_struct* tstruct); void generate_field_defns (std::ofstream& out, t_struct* tstruct); void generate_field_data (std::ofstream& out, t_type* field_type, const std::string& field_name, t_const_value* field_value, bool optional); @@ -455,6 +456,7 @@ void t_rb_generator::generate_rb_struct(std::ofstream& out, t_struct* tstruct, b generate_rb_simple_exception_constructor(out, tstruct); } + generate_field_constants(out, tstruct); generate_accessors(out, tstruct); generate_field_defns(out, tstruct); @@ -485,6 +487,19 @@ void t_rb_generator::generate_rb_simple_exception_constructor(std::ofstream& out } } +void t_rb_generator::generate_field_constants(std::ofstream& out, t_struct* tstruct) { + const vector& fields = tstruct->get_members(); + vector::const_iterator f_iter; + + for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { + std::string field_name = (*f_iter)->get_name(); + std::string cap_field_name = upcase_string(field_name); + + indent(out) << cap_field_name << " = " << (*f_iter)->get_key() << endl; + } + out << endl; +} + void t_rb_generator::generate_accessors(std::ofstream& out, t_struct* tstruct) { const vector& members = tstruct->get_members(); vector::const_iterator m_iter; @@ -510,7 +525,7 @@ void t_rb_generator::generate_field_defns(std::ofstream& out, t_struct* tstruct) } indent(out) << - (*f_iter)->get_key() << " => "; + upcase_string((*f_iter)->get_name()) << " => "; generate_field_data(out, (*f_iter)->get_type(), (*f_iter)->get_name(), (*f_iter)->get_value(), (*f_iter)->get_req() == t_field::T_OPTIONAL); diff --git a/lib/rb/benchmark/gen-rb/BenchmarkService.rb b/lib/rb/benchmark/gen-rb/BenchmarkService.rb index 42c8aecf..7d398825 100644 --- a/lib/rb/benchmark/gen-rb/BenchmarkService.rb +++ b/lib/rb/benchmark/gen-rb/BenchmarkService.rb @@ -46,17 +46,21 @@ require File.dirname(__FILE__) + '/Benchmark_types' class Fibonacci_args include Thrift::Struct + N = 1 + Thrift::Struct.field_accessor self, :n FIELDS = { - 1 => {:type => Thrift::Types::BYTE, :name => 'n'} + N => {:type => Thrift::Types::BYTE, :name => 'n'} } end class Fibonacci_result include Thrift::Struct + SUCCESS = 0 + Thrift::Struct.field_accessor self, :success FIELDS = { - 0 => {:type => Thrift::Types::I32, :name => 'success'} + SUCCESS => {:type => Thrift::Types::I32, :name => 'success'} } end diff --git a/lib/rb/spec/gen-rb/NonblockingService.rb b/lib/rb/spec/gen-rb/NonblockingService.rb index 5893f74c..ee5fae1c 100644 --- a/lib/rb/spec/gen-rb/NonblockingService.rb +++ b/lib/rb/spec/gen-rb/NonblockingService.rb @@ -115,22 +115,27 @@ require File.dirname(__FILE__) + '/ThriftSpec_types' class Greeting_args include Thrift::Struct + ENGLISH = 1 + Thrift::Struct.field_accessor self, :english FIELDS = { - 1 => {:type => Thrift::Types::BOOL, :name => 'english'} + ENGLISH => {:type => Thrift::Types::BOOL, :name => 'english'} } end class Greeting_result include Thrift::Struct + SUCCESS = 0 + Thrift::Struct.field_accessor self, :success FIELDS = { - 0 => {:type => Thrift::Types::STRUCT, :name => 'success', :class => Hello} + SUCCESS => {:type => Thrift::Types::STRUCT, :name => 'success', :class => Hello} } end class Block_args include Thrift::Struct + FIELDS = { } @@ -138,22 +143,27 @@ require File.dirname(__FILE__) + '/ThriftSpec_types' class Block_result include Thrift::Struct + SUCCESS = 0 + Thrift::Struct.field_accessor self, :success FIELDS = { - 0 => {:type => Thrift::Types::BOOL, :name => 'success'} + SUCCESS => {:type => Thrift::Types::BOOL, :name => 'success'} } end class Unblock_args include Thrift::Struct + N = 1 + Thrift::Struct.field_accessor self, :n FIELDS = { - 1 => {:type => Thrift::Types::I32, :name => 'n'} + N => {:type => Thrift::Types::I32, :name => 'n'} } end class Unblock_result include Thrift::Struct + FIELDS = { } @@ -161,6 +171,7 @@ require File.dirname(__FILE__) + '/ThriftSpec_types' class Shutdown_args include Thrift::Struct + FIELDS = { } @@ -168,6 +179,7 @@ require File.dirname(__FILE__) + '/ThriftSpec_types' class Shutdown_result include Thrift::Struct + FIELDS = { } @@ -175,14 +187,17 @@ require File.dirname(__FILE__) + '/ThriftSpec_types' class Sleep_args include Thrift::Struct + SECONDS = 1 + Thrift::Struct.field_accessor self, :seconds FIELDS = { - 1 => {:type => Thrift::Types::DOUBLE, :name => 'seconds'} + SECONDS => {:type => Thrift::Types::DOUBLE, :name => 'seconds'} } end class Sleep_result include Thrift::Struct + FIELDS = { } diff --git a/lib/rb/spec/gen-rb/ThriftSpec_types.rb b/lib/rb/spec/gen-rb/ThriftSpec_types.rb index d7ad6006..0251524a 100644 --- a/lib/rb/spec/gen-rb/ThriftSpec_types.rb +++ b/lib/rb/spec/gen-rb/ThriftSpec_types.rb @@ -9,59 +9,83 @@ require 'thrift/protocol' module SpecNamespace class Hello include Thrift::Struct + GREETING = 1 + Thrift::Struct.field_accessor self, :greeting FIELDS = { - 1 => {:type => Thrift::Types::STRING, :name => 'greeting', :default => 'hello world'} + GREETING => {:type => Thrift::Types::STRING, :name => 'greeting', :default => 'hello world'} } end class Foo include Thrift::Struct + SIMPLE = 1 + WORDS = 2 + HELLO = 3 + INTS = 4 + COMPLEX = 5 + SHORTS = 6 + OPT_STRING = 7 + Thrift::Struct.field_accessor self, :simple, :words, :hello, :ints, :complex, :shorts, :opt_string FIELDS = { - 1 => {:type => Thrift::Types::I32, :name => 'simple', :default => 53}, - 2 => {:type => Thrift::Types::STRING, :name => 'words', :default => 'words'}, - 3 => {:type => Thrift::Types::STRUCT, :name => 'hello', :default => Hello.new({ + SIMPLE => {:type => Thrift::Types::I32, :name => 'simple', :default => 53}, + WORDS => {:type => Thrift::Types::STRING, :name => 'words', :default => 'words'}, + HELLO => {:type => Thrift::Types::STRUCT, :name => 'hello', :default => Hello.new({ 'greeting' => 'hello, world!', }), :class => Hello}, - 4 => {:type => Thrift::Types::LIST, :name => 'ints', :default => [ + INTS => {:type => Thrift::Types::LIST, :name => 'ints', :default => [ 1, 2, 2, 3, ], :element => {:type => Thrift::Types::I32}}, - 5 => {:type => Thrift::Types::MAP, :name => 'complex', :key => {:type => Thrift::Types::I32}, :value => {:type => Thrift::Types::MAP, :key => {:type => Thrift::Types::STRING}, :value => {:type => Thrift::Types::DOUBLE}}}, - 6 => {:type => Thrift::Types::SET, :name => 'shorts', :default => Set.new([ 5, + COMPLEX => {:type => Thrift::Types::MAP, :name => 'complex', :key => {:type => Thrift::Types::I32}, :value => {:type => Thrift::Types::MAP, :key => {:type => Thrift::Types::STRING}, :value => {:type => Thrift::Types::DOUBLE}}}, + SHORTS => {:type => Thrift::Types::SET, :name => 'shorts', :default => Set.new([ 5, 17, 239, ]), :element => {:type => Thrift::Types::I16}}, - 7 => {:type => Thrift::Types::STRING, :name => 'opt_string', :optional => true} + OPT_STRING => {:type => Thrift::Types::STRING, :name => 'opt_string', :optional => true} } end class BoolStruct include Thrift::Struct + YESNO = 1 + Thrift::Struct.field_accessor self, :yesno FIELDS = { - 1 => {:type => Thrift::Types::BOOL, :name => 'yesno', :default => true} + YESNO => {:type => Thrift::Types::BOOL, :name => 'yesno', :default => true} } end class SimpleList include Thrift::Struct + BOOLS = 1 + BYTES = 2 + I16S = 3 + I32S = 4 + I64S = 5 + DOUBLES = 6 + STRINGS = 7 + MAPS = 8 + LISTS = 9 + SETS = 10 + HELLOS = 11 + Thrift::Struct.field_accessor self, :bools, :bytes, :i16s, :i32s, :i64s, :doubles, :strings, :maps, :lists, :sets, :hellos FIELDS = { - 1 => {:type => Thrift::Types::LIST, :name => 'bools', :element => {:type => Thrift::Types::BOOL}}, - 2 => {:type => Thrift::Types::LIST, :name => 'bytes', :element => {:type => Thrift::Types::BYTE}}, - 3 => {:type => Thrift::Types::LIST, :name => 'i16s', :element => {:type => Thrift::Types::I16}}, - 4 => {:type => Thrift::Types::LIST, :name => 'i32s', :element => {:type => Thrift::Types::I32}}, - 5 => {:type => Thrift::Types::LIST, :name => 'i64s', :element => {:type => Thrift::Types::I64}}, - 6 => {:type => Thrift::Types::LIST, :name => 'doubles', :element => {:type => Thrift::Types::DOUBLE}}, - 7 => {:type => Thrift::Types::LIST, :name => 'strings', :element => {:type => Thrift::Types::STRING}}, - 8 => {:type => Thrift::Types::LIST, :name => 'maps', :element => {:type => Thrift::Types::MAP, :key => {:type => Thrift::Types::I16}, :value => {:type => Thrift::Types::I16}}}, - 9 => {:type => Thrift::Types::LIST, :name => 'lists', :element => {:type => Thrift::Types::LIST, :element => {:type => Thrift::Types::I16}}}, - 10 => {:type => Thrift::Types::LIST, :name => 'sets', :element => {:type => Thrift::Types::SET, :element => {:type => Thrift::Types::I16}}}, - 11 => {:type => Thrift::Types::LIST, :name => 'hellos', :element => {:type => Thrift::Types::STRUCT, :class => Hello}} + BOOLS => {:type => Thrift::Types::LIST, :name => 'bools', :element => {:type => Thrift::Types::BOOL}}, + BYTES => {:type => Thrift::Types::LIST, :name => 'bytes', :element => {:type => Thrift::Types::BYTE}}, + I16S => {:type => Thrift::Types::LIST, :name => 'i16s', :element => {:type => Thrift::Types::I16}}, + I32S => {:type => Thrift::Types::LIST, :name => 'i32s', :element => {:type => Thrift::Types::I32}}, + I64S => {:type => Thrift::Types::LIST, :name => 'i64s', :element => {:type => Thrift::Types::I64}}, + DOUBLES => {:type => Thrift::Types::LIST, :name => 'doubles', :element => {:type => Thrift::Types::DOUBLE}}, + STRINGS => {:type => Thrift::Types::LIST, :name => 'strings', :element => {:type => Thrift::Types::STRING}}, + MAPS => {:type => Thrift::Types::LIST, :name => 'maps', :element => {:type => Thrift::Types::MAP, :key => {:type => Thrift::Types::I16}, :value => {:type => Thrift::Types::I16}}}, + LISTS => {:type => Thrift::Types::LIST, :name => 'lists', :element => {:type => Thrift::Types::LIST, :element => {:type => Thrift::Types::I16}}}, + SETS => {:type => Thrift::Types::LIST, :name => 'sets', :element => {:type => Thrift::Types::SET, :element => {:type => Thrift::Types::I16}}}, + HELLOS => {:type => Thrift::Types::LIST, :name => 'hellos', :element => {:type => Thrift::Types::STRUCT, :class => Hello}} } end -- 2.17.1