![]() |
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
00020 #include
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