Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /** 00002 * MOAB, a Mesh-Oriented datABase, is a software component for creating, 00003 * storing and accessing finite element mesh data. 00004 * 00005 * Copyright 2004 Sandia Corporation. Under the terms of Contract 00006 * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government 00007 * retains certain rights in this software. 00008 * 00009 * This library is free software; you can redistribute it and/or 00010 * modify it under the terms of the GNU Lesser General Public 00011 * License as published by the Free Software Foundation; either 00012 * version 2.1 of the License, or (at your option) any later version. 00013 * 00014 */ 00015 00016 #ifndef MOAB_READER_WRITER_SET_HPP 00017 #define MOAB_READER_WRITER_SET_HPP 00018 00019 #include <list> 00020 #include <string> 00021 #include "moab/Types.hpp" 00022 00023 namespace moab 00024 { 00025 00026 class ReaderIface; 00027 class WriterIface; 00028 class Core; 00029 00030 /** 00031 *\brief Maintain list of readers and writers. 00032 *\version 1.00 00033 *\date 2004-4-23 00034 *\author Jason Kraftcheck 00035 */ 00036 class ReaderWriterSet 00037 { 00038 00039 public: 00040 typedef ReaderIface* ( *reader_factory_t )( Interface* ); 00041 typedef WriterIface* ( *writer_factory_t )( Interface* ); 00042 00043 ReaderWriterSet( Core* mdb ); 00044 00045 ~ReaderWriterSet(); 00046 00047 /** 00048 * Regiseter a reader and/or writer 00049 * Either factory function may be NULL, but not both. 00050 * 00051 *\param reader_fact A factory method to create an instance of the reader 00052 *\param writer_fact A factory method to create an instance of the reader 00053 *\param description A short description of the file format. 00054 *\param extensions A null-terminated list of file extensions 00055 *\param name File format identifier string. 00056 */ 00057 ErrorCode register_factory( reader_factory_t reader_fact, 00058 writer_factory_t writer_fact, 00059 const char* description, 00060 const char* const* extensions, 00061 const char* name ); 00062 ErrorCode register_factory( reader_factory_t reader_fact, 00063 writer_factory_t writer_fact, 00064 const char* description, 00065 const char* extension, 00066 const char* name ); 00067 00068 /** 00069 * Create a reader object for the passed file name 00070 * according to the dot-extension of the file name. 00071 * Caller must delete the object when finished. 00072 * Returns null if no matching file extension. 00073 */ 00074 ReaderIface* get_file_extension_reader( const std::string& filename ) const; 00075 00076 /** 00077 * Create a writer object for the passed file name 00078 * according to the dot-extension of the file name. 00079 * Caller must delete the object when finished. 00080 * Returns null if no matching file extension. 00081 */ 00082 WriterIface* get_file_extension_writer( const std::string& filename ) const; 00083 00084 /** 00085 * Create a reader object for the passed file format type. 00086 * Caller is responsible for deletion of returned object. 00087 * Returns NULL if no match. 00088 */ 00089 ReaderIface* get_file_reader( const char* format_name ) const; 00090 00091 /** 00092 * Create a writer object for the passed file format type. 00093 * Caller is responsible for deletion of returned object. 00094 * Returns NULL if no match. 00095 */ 00096 WriterIface* get_file_writer( const char* format_name ) const; 00097 00098 /** 00099 * Get the file extension from a file name 00100 */ 00101 static std::string extension_from_filename( const std::string& filename ); 00102 00103 class Handler 00104 { 00105 00106 friend class ReaderWriterSet; 00107 00108 public: 00109 Handler( reader_factory_t read_f, 00110 writer_factory_t write_f, 00111 const char* name, 00112 const char* desc, 00113 const char* const* ext, 00114 int num_ext ); 00115 00116 inline const std::string& name() const 00117 { 00118 return mName; 00119 } 00120 inline const std::string& description() const 00121 { 00122 return mDescription; 00123 } 00124 inline void get_extensions( std::vector< std::string >& list_out ) const 00125 { 00126 list_out = mExtensions; 00127 } 00128 00129 inline bool have_reader() const 00130 { 00131 return NULL != mReader; 00132 } 00133 inline bool have_writer() const 00134 { 00135 return NULL != mWriter; 00136 } 00137 00138 inline ReaderIface* make_reader( Interface* iface ) const 00139 { 00140 return have_reader() ? mReader( iface ) : NULL; 00141 } 00142 00143 inline WriterIface* make_writer( Interface* iface ) const 00144 { 00145 return have_writer() ? mWriter( iface ) : NULL; 00146 } 00147 00148 bool reads_extension( const char* ext ) const; 00149 bool writes_extension( const char* ext ) const; 00150 00151 bool operator==( const char* name ) const; 00152 00153 private: 00154 reader_factory_t mReader; 00155 writer_factory_t mWriter; 00156 00157 std::string mName, mDescription; 00158 std::vector< std::string > mExtensions; 00159 }; 00160 00161 typedef std::list< Handler >::const_iterator iterator; 00162 00163 inline iterator begin() const 00164 { 00165 return handlerList.begin(); 00166 } 00167 00168 inline iterator end() const 00169 { 00170 return handlerList.end(); 00171 } 00172 00173 iterator handler_from_extension( const std::string& extension, 00174 bool with_reader = false, 00175 bool with_writer = false ) const; 00176 00177 iterator handler_by_name( const char* name ) const; 00178 00179 private: 00180 Core* mbCore; 00181 00182 std::list< Handler > handlerList; 00183 }; 00184 00185 } // namespace moab 00186 00187 #endif