]> Creatis software - cpPlugins.git/blob - bash/CreateInstances.cxx
yet another refactoring
[cpPlugins.git] / bash / CreateInstances.cxx
1 #include <bash/Config.h>
2
3 // -------------------------------------------------------------------------
4 int main( int argc, char* argv[] )
5 {
6   // Get inputs
7   if( argc < 4 )
8   {
9     std::cerr
10       << "Usage: " << argv[ 0 ]
11       << " definitons_file library_name output_prefix"
12       << std::endl;
13     return( 1 );
14
15   } // fi
16   std::string definitions_filename = argv[ 1 ];
17   std::string library_name = argv[ 2 ];
18   std::string output_prefix = argv[ 3 ];
19   unsigned int number_of_sources = cpPlugins_NUMBER_OF_FILES;
20
21   // Read inputs
22   std::string definitions_buffer;
23   if( !( cpPlugins_bash::Read( definitions_buffer, definitions_filename ) ) )
24   {
25     std::cerr
26       << argv[ 0 ]
27       <<  ": Error reading definitions file \"" << definitions_filename
28       << "\"" << std::endl;
29     return( 1 );
30
31   } // fi
32
33   // Put it in a line-by-line structure
34   TStrings definitions_lines;
35   cpPlugins_bash::Tokenize( definitions_lines, definitions_buffer, "\n" );
36
37   // Parse input file
38   TCommands commands;
39   cpPlugins_bash::Parse( commands, definitions_lines );
40
41   // Load pre-compiled definitions
42   cpPlugins_bash::LoadDefinitions( commands );
43
44   // Expand definitions
45   TCommands definitions;
46   cpPlugins_bash::ExpandDefinitions( definitions, commands );
47   definitions[ "_export_" ].clear( );
48   definitions[ "_export_" ].push_back( library_name + std::string( "_EXPORT" ) );
49
50   // Expand data
51   TStrings tfiles, cfiles, instances, minstances;
52   cpPlugins_bash::Expand( tfiles, definitions, commands, "tinclude" );
53   cpPlugins_bash::Expand( cfiles, definitions, commands, "cinclude" );
54   cpPlugins_bash::Expand( instances, definitions, commands, "instances" );
55   cpPlugins_bash::Expand( minstances, definitions, commands, "minstances" );
56
57   // Build all instances
58   TStrings all_instances;
59   for( auto iIt = instances.begin( ); iIt != instances.end( ); ++iIt )
60   {
61     std::stringstream str;
62     str << "template class " << library_name << "_EXPORT " << *iIt;
63     all_instances.push_back( str.str( ) );
64
65   } // rof
66   for( auto iIt = minstances.begin( ); iIt != minstances.end( ); ++iIt )
67   {
68     std::stringstream str;
69     str << "template " << *iIt;
70     all_instances.push_back( str.str( ) );
71
72   } // rof
73
74   // Write source code
75   unsigned int instances_per_file =
76     ( unsigned int )(
77       std::floor( double( all_instances.size( ) ) / double( number_of_sources ) )
78       );
79   if( instances_per_file == 0 )
80     instances_per_file = 1;
81   std::vector< std::vector< std::string > > all_lines( 1 );
82   for( unsigned int c_id = 0; c_id < all_instances.size( ); ++c_id )
83   {
84     all_lines[ all_lines.size( ) - 1 ].push_back( all_instances[ c_id ] );
85     if( c_id % instances_per_file == instances_per_file - 1 )
86       all_lines.push_back( std::vector< std::string >( ) );
87
88   } // rof
89
90   // Paranoiac code
91   while( all_lines.size( ) > number_of_sources )
92   {
93     all_lines[ all_lines.size( ) - 2 ].insert(
94       all_lines[ all_lines.size( ) - 2 ].end( ),
95       all_lines[ all_lines.size( ) - 1 ].begin( ),
96       all_lines[ all_lines.size( ) - 1 ].end( )
97       );
98     all_lines.pop_back( );
99
100   } // elihw
101   while( all_lines.size( ) < number_of_sources )
102     all_lines.push_back( std::vector< std::string >( ) );
103
104   // Real write
105   for( unsigned int f_id = 0; f_id < all_lines.size( ); ++f_id )
106   {
107     std::stringstream source;
108     source
109       << "#include <" << library_name << "_Export.h>"
110       << std::endl;
111     auto hIt = commands.find( "header" );
112     if( hIt != commands.end( ) )
113     {
114       source << std::endl;
115       for( auto vIt = hIt->second.begin( ); vIt != hIt->second.end( ); ++vIt )
116         source << *vIt << std::endl;
117       source << std::endl;
118
119     } // fi
120
121     if( tfiles.size( ) > 0 )
122     {
123       for( auto tIt = tfiles.begin( ); tIt != tfiles.end( ); ++tIt )
124       {
125         TStrings toks;
126         cpPlugins_bash::Tokenize( toks, *tIt, ":|" );
127         if( toks.size( ) == 3 )
128         {
129           source << "#include <" << toks[ 0 ] << "." << toks[ 1 ] << ">" << std::endl;
130           source << "#include <" << toks[ 0 ] << "." << toks[ 2 ] << ">" << std::endl;
131
132         } // fi
133
134       } // rof
135       source << std::endl;
136
137     } // fi
138
139     if( cfiles.size( ) > 0 )
140     {
141       for( auto cIt = cfiles.begin( ); cIt != cfiles.end( ); ++cIt )
142         source << "#include <" << *cIt << ">" << std::endl;
143       source << std::endl;
144
145     } // fi
146
147     for(
148       auto c_it = all_lines[ f_id ].begin( );
149       c_it != all_lines[ f_id ].end( );
150       ++c_it
151       )
152       source << *c_it << ";" << std::endl;
153     source << std::endl << "// eof" << std::endl;
154     std::stringstream source_file;
155     source_file
156       << output_prefix << "_" << f_id << ".cxx";
157     if( !( cpPlugins_bash::Write( source.str( ), source_file.str( ) ) ) )
158     {
159       std::cerr << "Error writing source code." << std::endl;
160       return( 1 );
161
162     } // fi
163
164   } // rof
165   return( 0 );
166 }
167
168 // eof - $RCSfile$