Branch data Line data Source code
1 : : /**
2 : : * MOAB, a Mesh-Oriented datABase, is a software component for creating,
3 : : * storing and accessing finite element mesh data.
4 : : *
5 : : * Copyright 2004 Sandia Corporation. Under the terms of Contract
6 : : * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
7 : : * retains certain rights in this software.
8 : : *
9 : : * This library is free software; you can redistribute it and/or
10 : : * modify it under the terms of the GNU Lesser General Public
11 : : * License as published by the Free Software Foundation; either
12 : : * version 2.1 of the License, or (at your option) any later version.
13 : : *
14 : : */
15 : :
16 : : #ifndef MOAB_READER_WRITER_SET_HPP
17 : : #define MOAB_READER_WRITER_SET_HPP
18 : :
19 : : #include <list>
20 : : #include <string>
21 : : #include "moab/Types.hpp"
22 : :
23 : : namespace moab
24 : : {
25 : :
26 : : class ReaderIface;
27 : : class WriterIface;
28 : : class Core;
29 : :
30 : : /**
31 : : *\brief Maintain list of readers and writers.
32 : : *\version 1.00
33 : : *\date 2004-4-23
34 : : *\author Jason Kraftcheck
35 : : */
36 : : class ReaderWriterSet
37 : : {
38 : :
39 : : public:
40 : : typedef ReaderIface* ( *reader_factory_t )( Interface* );
41 : : typedef WriterIface* ( *writer_factory_t )( Interface* );
42 : :
43 : : ReaderWriterSet( Core* mdb );
44 : :
45 : : ~ReaderWriterSet();
46 : :
47 : : /**
48 : : * Regiseter a reader and/or writer
49 : : * Either factory function may be NULL, but not both.
50 : : *
51 : : *\param reader_fact A factory method to create an instance of the reader
52 : : *\param writer_fact A factory method to create an instance of the reader
53 : : *\param description A short description of the file format.
54 : : *\param extensions A null-terminated list of file extensions
55 : : *\param name File format identifier string.
56 : : */
57 : : ErrorCode register_factory( reader_factory_t reader_fact, writer_factory_t writer_fact, const char* description,
58 : : const char* const* extensions, const char* name );
59 : : ErrorCode register_factory( reader_factory_t reader_fact, writer_factory_t writer_fact, const char* description,
60 : : const char* extension, const char* name );
61 : :
62 : : /**
63 : : * Create a reader object for the passed file name
64 : : * according to the dot-extension of the file name.
65 : : * Caller must delete the object when finished.
66 : : * Returns null if no matching file extension.
67 : : */
68 : : ReaderIface* get_file_extension_reader( const std::string& filename ) const;
69 : :
70 : : /**
71 : : * Create a writer object for the passed file name
72 : : * according to the dot-extension of the file name.
73 : : * Caller must delete the object when finished.
74 : : * Returns null if no matching file extension.
75 : : */
76 : : WriterIface* get_file_extension_writer( const std::string& filename ) const;
77 : :
78 : : /**
79 : : * Create a reader object for the passed file format type.
80 : : * Caller is responsible for deletion of returned object.
81 : : * Returns NULL if no match.
82 : : */
83 : : ReaderIface* get_file_reader( const char* format_name ) const;
84 : :
85 : : /**
86 : : * Create a writer object for the passed file format type.
87 : : * Caller is responsible for deletion of returned object.
88 : : * Returns NULL if no match.
89 : : */
90 : : WriterIface* get_file_writer( const char* format_name ) const;
91 : :
92 : : /**
93 : : * Get the file extension from a file name
94 : : */
95 : : static std::string extension_from_filename( const std::string& filename );
96 : :
97 : 51198 : class Handler
98 : : {
99 : :
100 : : friend class ReaderWriterSet;
101 : :
102 : : public:
103 : : Handler( reader_factory_t read_f, writer_factory_t write_f, const char* name, const char* desc,
104 : : const char* const* ext, int num_ext );
105 : :
106 : 0 : inline const std::string& name() const
107 : : {
108 : 0 : return mName;
109 : : }
110 : 0 : inline const std::string& description() const
111 : : {
112 : 0 : return mDescription;
113 : : }
114 : : inline void get_extensions( std::vector< std::string >& list_out ) const
115 : : {
116 : : list_out = mExtensions;
117 : : }
118 : :
119 : 1017 : inline bool have_reader() const
120 : : {
121 : 1017 : return NULL != mReader;
122 : : }
123 : 586 : inline bool have_writer() const
124 : : {
125 : 586 : return NULL != mWriter;
126 : : }
127 : :
128 : 141 : inline ReaderIface* make_reader( Interface* iface ) const
129 : : {
130 [ + + ]: 141 : return have_reader() ? mReader( iface ) : NULL;
131 : : }
132 : :
133 : 31 : inline WriterIface* make_writer( Interface* iface ) const
134 : : {
135 [ + - ]: 31 : return have_writer() ? mWriter( iface ) : NULL;
136 : : }
137 : :
138 : : bool reads_extension( const char* ext ) const;
139 : : bool writes_extension( const char* ext ) const;
140 : :
141 : : bool operator==( const char* name ) const;
142 : :
143 : : private:
144 : : reader_factory_t mReader;
145 : : writer_factory_t mWriter;
146 : :
147 : : std::string mName, mDescription;
148 : : std::vector< std::string > mExtensions;
149 : : };
150 : :
151 : : typedef std::list< Handler >::const_iterator iterator;
152 : :
153 : 34789 : inline iterator begin() const
154 : : {
155 : 34789 : return handlerList.begin();
156 : : }
157 : :
158 : 341529 : inline iterator end() const
159 : : {
160 : 341529 : return handlerList.end();
161 : : }
162 : :
163 : : iterator handler_from_extension( const std::string& extension, bool with_reader = false,
164 : : bool with_writer = false ) const;
165 : :
166 : : iterator handler_by_name( const char* name ) const;
167 : :
168 : : private:
169 : : Core* mbCore;
170 : :
171 : : std::list< Handler > handlerList;
172 : : };
173 : :
174 : : } // namespace moab
175 : :
176 : : #endif
|