]> Creatis software - cpPlugins.git/blobdiff - appli/bash/CreateInstances.cxx
...
[cpPlugins.git] / appli / bash / CreateInstances.cxx
diff --git a/appli/bash/CreateInstances.cxx b/appli/bash/CreateInstances.cxx
new file mode 100644 (file)
index 0000000..b68c087
--- /dev/null
@@ -0,0 +1,168 @@
+#include <bash/Config.h>
+
+// -------------------------------------------------------------------------
+int main( int argc, char* argv[] )
+{
+  // Get inputs
+  if( argc < 4 )
+  {
+    std::cerr
+      << "Usage: " << argv[ 0 ]
+      << " definitons_file library_name output_prefix"
+      << std::endl;
+    return( 1 );
+
+  } // fi
+  std::string definitions_filename = argv[ 1 ];
+  std::string library_name = argv[ 2 ];
+  std::string output_prefix = argv[ 3 ];
+  unsigned int number_of_sources = cpPlugins_CONFIG_NUMBER_OF_FILES;
+
+  // Read inputs
+  std::string definitions_buffer;
+  if( !( cpPlugins_bash::Read( definitions_buffer, definitions_filename ) ) )
+  {
+    std::cout
+      << argv[ 0 ]
+      <<  ": Error reading definitions file \"" << definitions_filename
+      << "\"" << std::endl;
+    return( 1 );
+
+  } // fi
+
+  // Put it in a line-by-line structure
+  TStrings definitions_lines;
+  cpPlugins_bash::Tokenize( definitions_lines, definitions_buffer, "\n" );
+
+  // Parse input file
+  TCommands commands;
+  cpPlugins_bash::Parse( commands, definitions_lines );
+
+  // Load pre-compiled definitions
+  cpPlugins_bash::LoadDefinitions( commands );
+
+  // Expand definitions
+  TCommands definitions;
+  cpPlugins_bash::ExpandDefinitions( definitions, commands );
+  definitions[ "_export_" ].clear( );
+  definitions[ "_export_" ].push_back( library_name + std::string( "_EXPORT" ) );
+
+  // Expand data
+  TStrings tfiles, cfiles, instances, minstances;
+  cpPlugins_bash::Expand( tfiles, definitions, commands, "tinclude" );
+  cpPlugins_bash::Expand( cfiles, definitions, commands, "cinclude" );
+  cpPlugins_bash::Expand( instances, definitions, commands, "instances" );
+  cpPlugins_bash::Expand( minstances, definitions, commands, "minstances" );
+
+  // Build all instances
+  TStrings all_instances;
+  for( auto iIt = instances.begin( ); iIt != instances.end( ); ++iIt )
+  {
+    std::stringstream str;
+    str << "template class " << library_name << "_EXPORT " << *iIt;
+    all_instances.push_back( str.str( ) );
+
+  } // rof
+  for( auto iIt = minstances.begin( ); iIt != minstances.end( ); ++iIt )
+  {
+    std::stringstream str;
+    str << "template " << *iIt;
+    all_instances.push_back( str.str( ) );
+
+  } // rof
+
+  // Write source code
+  unsigned int instances_per_file =
+    ( unsigned int )(
+      std::floor( double( all_instances.size( ) ) / double( number_of_sources ) )
+      );
+  if( instances_per_file == 0 )
+    instances_per_file = 1;
+  std::vector< std::vector< std::string > > all_lines( 1 );
+  for( unsigned int c_id = 0; c_id < all_instances.size( ); ++c_id )
+  {
+    all_lines[ all_lines.size( ) - 1 ].push_back( all_instances[ c_id ] );
+    if( c_id % instances_per_file == instances_per_file - 1 )
+      all_lines.push_back( std::vector< std::string >( ) );
+
+  } // rof
+
+  // Paranoiac code
+  while( all_lines.size( ) > number_of_sources )
+  {
+    all_lines[ all_lines.size( ) - 2 ].insert(
+      all_lines[ all_lines.size( ) - 2 ].end( ),
+      all_lines[ all_lines.size( ) - 1 ].begin( ),
+      all_lines[ all_lines.size( ) - 1 ].end( )
+      );
+    all_lines.pop_back( );
+
+  } // elihw
+  while( all_lines.size( ) < number_of_sources )
+    all_lines.push_back( std::vector< std::string >( ) );
+
+  // Real write
+  for( unsigned int f_id = 0; f_id < all_lines.size( ); ++f_id )
+  {
+    std::stringstream source;
+    source
+      << "#include <" << library_name << "_Export.h>"
+      << std::endl;
+    auto hIt = commands.find( "header" );
+    if( hIt != commands.end( ) )
+    {
+      source << std::endl;
+      for( auto vIt = hIt->second.begin( ); vIt != hIt->second.end( ); ++vIt )
+        source << *vIt << std::endl;
+      source << std::endl;
+
+    } // fi
+
+    if( tfiles.size( ) > 0 )
+    {
+      for( auto tIt = tfiles.begin( ); tIt != tfiles.end( ); ++tIt )
+      {
+        TStrings toks;
+        cpPlugins_bash::Tokenize( toks, *tIt, ":|" );
+        if( toks.size( ) == 3 )
+        {
+          source << "#include <" << toks[ 0 ] << "." << toks[ 1 ] << ">" << std::endl;
+          source << "#include <" << toks[ 0 ] << "." << toks[ 2 ] << ">" << std::endl;
+
+        } // fi
+
+      } // rof
+      source << std::endl;
+
+    } // fi
+
+    if( cfiles.size( ) > 0 )
+    {
+      for( auto cIt = cfiles.begin( ); cIt != cfiles.end( ); ++cIt )
+        source << "#include <" << *cIt << ">" << std::endl;
+      source << std::endl;
+
+    } // fi
+
+    for(
+      auto c_it = all_lines[ f_id ].begin( );
+      c_it != all_lines[ f_id ].end( );
+      ++c_it
+      )
+      source << *c_it << ";" << std::endl;
+    source << std::endl << "// eof" << std::endl;
+    std::stringstream source_file;
+    source_file
+      << output_prefix << "_" << f_id << ".cxx";
+    if( !( cpPlugins_bash::Write( source.str( ), source_file.str( ) ) ) )
+    {
+      std::cerr << "Error writing source code." << std::endl;
+      return( 1 );
+
+    } // fi
+
+  } // rof
+  return( 0 );
+}
+
+// eof - $RCSfile$