Skip to content

Commit 5a7b9c0

Browse files
committed
added needed includes and put declarations before all definitions
1 parent 87716bf commit 5a7b9c0

1 file changed

Lines changed: 82 additions & 25 deletions

File tree

src/json_to_cpp.cpp

Lines changed: 82 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ namespace daw {
3434
namespace json_to_cpp {
3535
bool enable_comments;
3636
bool enable_jsonlink;
37+
struct state_t {
38+
bool has_arrays;
39+
bool has_integrals;
40+
bool has_optionals;
41+
bool has_strings;
42+
state_t( ):
43+
has_arrays{ false },
44+
has_integrals{ false },
45+
has_optionals{ false },
46+
has_strings{ false } { }
47+
};
3748

3849
void config_t::set_links( ) {
3950
link_boolean( "enable_comments", enable_comments );
@@ -100,13 +111,13 @@ namespace daw {
100111
return "unknown_" + std::to_string( unknown_count( ) );
101112
}
102113

103-
void parse_json_array( boost::string_view cur_name, daw::json::impl::value_t const & cur_item, std::vector<obj_info_t> & obj_info );
114+
void parse_json_array( boost::string_view cur_name, daw::json::impl::value_t const & cur_item, std::vector<obj_info_t> & obj_info, state_t & obj_state );
104115

105116
auto find_by_name( std::vector<obj_info_t> & obj_info, std::string const & name ) {
106117
return std::find_if( obj_info.begin( ), obj_info.end( ), [&]( auto const & v ) { return v.name == name; } );
107118
}
108119

109-
void parse_json_object( boost::string_view cur_name, daw::json::impl::object_value const & cur_item, std::vector<obj_info_t> & obj_info ) {
120+
void parse_json_object( boost::string_view cur_name, daw::json::impl::object_value const & cur_item, std::vector<obj_info_t> & obj_info, state_t & obj_state ) {
110121
using daw::json::impl::value_t;
111122

112123
obj_info_t cur_obj;
@@ -120,12 +131,23 @@ namespace daw {
120131
val_info.type = member.second.type( );
121132
cur_obj.members[val_info.name] = val_info;
122133

123-
if( val_info.type == value_t::value_types::object ) {
124-
parse_json_object( val_info.name, member.second.get_object( ), obj_info );
125-
} else if( val_info.type == value_t::value_types::array ) {
126-
parse_json_array( val_info.name, member.second, obj_info );
127-
}
128-
134+
switch( val_info.type ) {
135+
case value_t::value_types::array:
136+
obj_state.has_arrays = true;
137+
parse_json_array( val_info.name, member.second, obj_info, obj_state );
138+
break;
139+
case value_t::value_types::object:
140+
parse_json_object( val_info.name, member.second.get_object( ), obj_info, obj_state );
141+
break;
142+
case value_t::value_types::integral:
143+
obj_state.has_integrals = true;
144+
break;
145+
case value_t::value_types::string:
146+
obj_state.has_strings = true;
147+
break;
148+
default:
149+
break;
150+
}
129151
}
130152

131153
auto old_item = find_by_name( obj_info, cur_obj.name );
@@ -138,7 +160,7 @@ namespace daw {
138160
}
139161
}
140162

141-
void parse_json_array( boost::string_view cur_name, daw::json::impl::value_t const & cur_item, std::vector<obj_info_t> & obj_info ) {
163+
void parse_json_array( boost::string_view cur_name, daw::json::impl::value_t const & cur_item, std::vector<obj_info_t> & obj_info, state_t & obj_state ) {
142164
using daw::json::impl::value_t;
143165
obj_info_t cur_obj;
144166
cur_obj.is_array = true;
@@ -150,15 +172,29 @@ namespace daw {
150172
val_info.name = "element_" + cur_obj.name;
151173
auto const & arry = cur_item.get_array( );
152174
val_info.type = arry.front( ).type( );
153-
if( val_info.type == value_t::value_types::array ) {
154-
for( auto const & item: arry ) {
155-
parse_json_array( val_info.name, item, obj_info );
156-
}
157-
} else if( val_info.type == value_t::value_types::object ) {
158-
for( auto const & item: arry ) {
159-
parse_json_object( val_info.name, item.get_object( ), obj_info );
175+
switch( val_info.type ) {
176+
case value_t::value_types::array: {
177+
obj_state.has_arrays = true;
178+
for( auto const & item: arry ) {
179+
parse_json_array( val_info.name, item, obj_info, obj_state );
180+
}
160181
}
182+
break;
183+
case value_t::value_types::object:
184+
for( auto const & item: arry ) {
185+
parse_json_object( val_info.name, item.get_object( ), obj_info, obj_state );
186+
}
187+
break;
188+
case value_t::value_types::integral:
189+
obj_state.has_integrals = true;
190+
break;
191+
case value_t::value_types::string:
192+
obj_state.has_strings = true;
193+
break;
194+
default:
195+
break;
161196
}
197+
162198
cur_obj.members[val_info.name] = val_info;
163199

164200
auto old_item = find_by_name( obj_info, cur_obj.name );
@@ -171,12 +207,13 @@ namespace daw {
171207
}
172208
}
173209

174-
std::vector<obj_info_t> parse_json_object( daw::json::impl::value_t const & json_obj ) {
210+
std::vector<obj_info_t> parse_json_object( daw::json::impl::value_t const & json_obj, state_t & obj_state ) {
175211
std::vector<obj_info_t> result;
212+
176213
if( json_obj.type( ) == daw::json::impl::value_t::value_types::object ) {
177-
parse_json_object( "root_type", json_obj.get_object( ), result );
214+
parse_json_object( "root_type", json_obj.get_object( ), result, obj_state );
178215
} else if( json_obj.type( ) == daw::json::impl::value_t::value_types::array ) {
179-
parse_json_array( "root_type", json_obj, result );
216+
parse_json_array( "root_type", json_obj, result, obj_state );
180217
} else {
181218
std::cerr << "Root object must either be an array or object and not a bare json value(e.g. integer, real, boolean...)";
182219
exit( EXIT_FAILURE );
@@ -305,9 +342,20 @@ namespace daw {
305342
}
306343
}
307344

308-
std::string generate_code( std::vector<obj_info_t> obj_info, config_t const & config ) {
345+
void generate_includes( std::stringstream & ss, config_t const & config, state_t const & obj_state ) {
346+
if( obj_state.has_optionals ) ss << "#include <boost/optional.hpp>\n";
347+
if( obj_state.has_integrals ) ss << "#include <cstdint>\n";
348+
if( obj_state.has_strings ) ss << "#include <string>\n";
349+
if( obj_state.has_arrays ) ss << "#include <vector>\n";
350+
if( config.enable_jsonlink ) ss << "#include <daw/json/daw_json_link.h>\n";
351+
ss << '\n';
352+
}
353+
354+
std::string generate_code( std::vector<obj_info_t> obj_info, config_t const & config, state_t const & obj_state ) {
309355
using daw::json::impl::value_t;
310356
std::stringstream ss;
357+
ss << "// Code auto generated from json file.\n";
358+
generate_includes( ss, config, obj_state );
311359
for( auto const & cur_obj: obj_info ) {
312360
auto const obj_type = cur_obj.name + "_t";
313361

@@ -343,9 +391,17 @@ namespace daw {
343391
if( config.enable_comments ) {
344392
ss << "\t// " << obj_type;
345393
}
346-
ss << "\n\n";
347-
if( config.enable_jsonlink ) {
348-
generate_jsonlink( true, ss, obj_type, cur_obj );
394+
ss << "\n";
395+
}
396+
for( auto const & cur_obj: obj_info ) {
397+
auto const obj_type = cur_obj.name + "_t";
398+
for( auto const & item: cur_obj.members ) {
399+
auto const & member = item.second;
400+
auto const member_type = type_to_string( member.name, member.type );
401+
if( config.enable_jsonlink ) {
402+
generate_jsonlink( true, ss, obj_type, cur_obj );
403+
}
404+
ss << '\n';
349405
}
350406
}
351407
return ss.str( );
@@ -354,9 +410,10 @@ namespace daw {
354410
} // namespace anonymous
355411

356412
std::string generate_cpp( boost::string_view json_string, config_t const & config ) {
413+
state_t obj_state;
357414
auto json_obj = daw::json::parse_json( json_string );
358-
auto obj_info = parse_json_object( json_obj );
359-
std::string result = generate_code( obj_info, config );
415+
auto obj_info = parse_json_object( json_obj, obj_state );
416+
std::string result = generate_code( obj_info, config, obj_state );
360417

361418
return result;
362419

0 commit comments

Comments
 (0)