AFEPack
Migration.h
浏览该文件的文档。
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