AFEPack
|
00001 00011 #ifndef __Migration_h__ 00012 #define __Migration_h__ 00013 00014 #include <map> 00015 #include "BinaryBuffer.h" 00016 #include "TemplateElement.h" 00017 00040 namespace Migration { 00041 00042 typedef int data_id_t; 00043 typedef std::string data_name_t; 00044 typedef BinaryBuffer<> data_buffer_t; 00045 00048 typedef std::map<data_id_t, data_buffer_t> buffer_t; 00049 00050 data_id_t name_to_id(const data_name_t& dn); 00051 data_id_t register_data_name(const data_name_t& dn, bool); 00052 void initialize(); 00053 bool is_valid(const data_id_t&); 00054 00058 struct HBuffer { 00059 buffer_t buffer; 00060 virtual ~HBuffer() {} 00061 }; 00062 00063 namespace details { 00073 template <class HGEO> BinaryBuffer<>& 00074 get_buffer(const HGEO& geo, 00075 const data_id_t& data_id, 00076 bool is_save) { 00080 buffer_t& buffer = *(buffer_t *)(&geo.buffer); 00081 if (is_save) { 00082 return buffer[data_id]; 00083 } else { 00084 buffer_t::iterator it = buffer.find(data_id); 00085 if (it == buffer.end()) { 00086 return *((BinaryBuffer<> *)NULL); 00087 } 00088 return it->second; 00089 } 00090 } 00091 00104 template <class MESH> BinaryBuffer<>& 00105 get_buffer(MESH& mesh, 00106 const data_id_t& data_id, 00107 u_int dimension, 00108 u_int geo_idx, 00109 bool is_save) { 00110 buffer_t& buffer = mesh.h_geometry(dimension, geo_idx)->buffer; 00111 if (is_save) { 00112 return buffer[data_id]; 00113 } else { 00114 buffer_t::iterator it = buffer.find(data_id); 00115 if (it == buffer.end()) { 00116 return *((BinaryBuffer<> *)NULL); 00117 } 00118 return it->second; 00119 } 00120 } 00121 00122 } 00123 00131 template <class HGEO, class STREAM> void 00132 get_export_stream(HGEO& geo, 00133 const data_id_t& data_id, 00134 STREAM& os) { 00135 os.set_buffer(details::get_buffer(geo, data_id, true)); 00136 } 00137 00145 template <class HGEO, class STREAM> void 00146 get_import_stream(HGEO& geo, 00147 const data_id_t& data_id, 00148 STREAM& is) { 00149 is.set_buffer(details::get_buffer(geo, data_id, false)); 00150 } 00151 00161 template <class MESH, class STREAM> void 00162 get_export_stream(MESH& mesh, 00163 const data_id_t& data_id, 00164 u_int dimension, 00165 u_int geo_idx, 00166 STREAM& os) { 00167 os.set_buffer(details::get_buffer(mesh, data_id, dimension, geo_idx, true)); 00168 } 00169 00179 template <class MESH, class STREAM> void 00180 get_import_stream(MESH& mesh, 00181 const data_id_t& data_id, 00182 u_int dimension, 00183 u_int geo_idx, 00184 STREAM& is) { 00185 is.set_buffer(details::get_buffer(mesh, data_id, dimension, geo_idx, false)); 00186 } 00187 00197 template <class MESH, class SP, class STREAM> void 00198 get_dof_export_stream(MESH& mesh, 00199 SP& sp, 00200 const data_id_t& data_id, 00201 int dof, 00202 STREAM& os) { 00203 const DOFIndex& di = sp.dofIndex(dof); 00204 get_export_stream(mesh, data_id, di.dimension, di.geometry_index, os); 00205 } 00206 00216 template <class MESH, class SP, class STREAM> void 00217 get_dof_import_stream(MESH& mesh, 00218 SP& sp, 00219 const data_id_t& data_id, 00220 int dof, 00221 STREAM& is) { 00222 const DOFIndex& di = sp.dofIndex(dof); 00223 get_import_stream(mesh, data_id, di.dimension, di.geometry_index, is); 00224 } 00225 00226 } // end of namespace Migration 00227 00228 #endif // __Migration_h__ 00229