![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #ifndef MBIMESH_HPP
00002 #define MBIMESH_HPP
00003
00004 #include "moab/Core.hpp"
00005 #include
00006 #include
00007 #include
00008
00009 using namespace moab;
00010
00011 /* map from MOAB's ErrorCode to tstt's */
00012 extern "C" const iBase_ErrorType iBase_ERROR_MAP[MB_FAILURE + 1];
00013
00014 class MBiMesh
00015 {
00016 private:
00017 bool haveDeletedEntities;
00018 bool iCreatedInterface;
00019 std::vector< Tag > setHandleTags, entHandleTags;
00020
00021 public:
00022 MBiMesh( moab::Interface* mbImpl = NULL );
00023
00024 virtual ~MBiMesh();
00025 bool have_deleted_ents( bool reset )
00026 {
00027 bool result = haveDeletedEntities;
00028 if( reset ) haveDeletedEntities = false;
00029 return result;
00030 }
00031
00032 virtual ErrorCode delete_mesh();
00033 virtual ErrorCode delete_entities( const EntityHandle*, const int );
00034 virtual ErrorCode delete_entities( const Range& );
00035 iBase_AdjacencyCost AdjTable[16];
00036 moab::Interface* mbImpl;
00037 int lastErrorType;
00038 char lastErrorDescription[120];
00039
00040 inline void note_set_handle_tag( Tag );
00041 inline void note_ent_handle_tag( Tag );
00042 inline void note_tag_destroyed( Tag );
00043 inline bool is_set_handle_tag( Tag ) const;
00044 inline bool is_ent_handle_tag( Tag ) const;
00045
00046 inline int set_last_error( int, const char* );
00047 inline int set_last_error( ErrorCode, const char* );
00048 };
00049
00050 static inline MBiMesh* mbimeshi_instance( iMesh_Instance instance )
00051 {
00052 return reinterpret_cast< MBiMesh* >( instance );
00053 }
00054 #define MBIMESHI mbimeshi_instance( instance )
00055 #define MOABI MBIMESHI->mbImpl
00056
00057 inline MBiMesh::MBiMesh( Interface* impl )
00058 : haveDeletedEntities( false ), iCreatedInterface( false ), mbImpl( impl ), lastErrorType( iBase_SUCCESS )
00059 {
00060 lastErrorDescription[0] = '\0';
00061
00062 iBase_AdjacencyCost tmp_table[] = { iBase_ALL_ORDER_1, iBase_SOME_ORDER_1, iBase_SOME_ORDER_1,
00063 iBase_ALL_ORDER_1, iBase_ALL_ORDER_1, iBase_UNAVAILABLE,
00064 iBase_SOME_ORDER_LOGN, iBase_SOME_ORDER_LOGN, iBase_ALL_ORDER_1,
00065 iBase_SOME_ORDER_LOGN, iBase_UNAVAILABLE, iBase_SOME_ORDER_LOGN,
00066 iBase_ALL_ORDER_1, iBase_SOME_ORDER_LOGN, iBase_SOME_ORDER_LOGN,
00067 iBase_ALL_ORDER_1 };
00068 memcpy( AdjTable, tmp_table, 16 * sizeof( iBase_AdjacencyCost ) );
00069
00070 if( !mbImpl )
00071 {
00072 mbImpl = new Core();
00073 iCreatedInterface = true;
00074 }
00075 }
00076
00077 inline MBiMesh::~MBiMesh()
00078 {
00079 if( iCreatedInterface ) delete mbImpl;
00080 }
00081
00082 inline ErrorCode MBiMesh::delete_mesh()
00083 {
00084 haveDeletedEntities = true;
00085 return mbImpl->delete_mesh();
00086 }
00087
00088 inline ErrorCode MBiMesh::delete_entities( const EntityHandle* a, const int n )
00089 {
00090 if( n > 0 ) haveDeletedEntities = true;
00091 return mbImpl->delete_entities( a, n );
00092 }
00093
00094 inline ErrorCode MBiMesh::delete_entities( const Range& r )
00095 {
00096 if( !r.empty() ) haveDeletedEntities = true;
00097 return mbImpl->delete_entities( r );
00098 }
00099
00100 void MBiMesh::note_set_handle_tag( Tag t )
00101 {
00102 std::vector< Tag >::iterator i;
00103 i = std::lower_bound( entHandleTags.begin(), entHandleTags.end(), t );
00104 if( i != entHandleTags.end() && *i == t ) entHandleTags.erase( i );
00105 i = std::lower_bound( setHandleTags.begin(), setHandleTags.end(), t );
00106 if( i == setHandleTags.end() || *i != t ) setHandleTags.insert( i, t );
00107 }
00108
00109 void MBiMesh::note_ent_handle_tag( Tag t )
00110 {
00111 std::vector< Tag >::iterator i;
00112 i = std::lower_bound( setHandleTags.begin(), setHandleTags.end(), t );
00113 if( i != setHandleTags.end() && *i == t ) setHandleTags.erase( i );
00114 i = std::lower_bound( entHandleTags.begin(), entHandleTags.end(), t );
00115 if( i == entHandleTags.end() || *i != t ) entHandleTags.insert( i, t );
00116 }
00117
00118 void MBiMesh::note_tag_destroyed( Tag t )
00119 {
00120 std::vector< Tag >::iterator i;
00121 i = std::lower_bound( setHandleTags.begin(), setHandleTags.end(), t );
00122 if( i != setHandleTags.end() && *i == t ) setHandleTags.erase( i );
00123 i = std::lower_bound( entHandleTags.begin(), entHandleTags.end(), t );
00124 if( i != entHandleTags.end() && *i == t ) entHandleTags.erase( i );
00125 }
00126
00127 bool MBiMesh::is_set_handle_tag( Tag t ) const
00128 {
00129 return std::binary_search( setHandleTags.begin(), setHandleTags.end(), t );
00130 }
00131
00132 bool MBiMesh::is_ent_handle_tag( Tag t ) const
00133 {
00134 return std::binary_search( entHandleTags.begin(), entHandleTags.end(), t );
00135 }
00136
00137 int MBiMesh::set_last_error( int code, const char* msg )
00138 {
00139 std::strncpy( lastErrorDescription, msg, sizeof( lastErrorDescription ) );
00140 lastErrorDescription[sizeof( lastErrorDescription ) - 1] = '\0';
00141 return ( lastErrorType = static_cast< iBase_ErrorType >( code ) );
00142 }
00143
00144 int MBiMesh::set_last_error( ErrorCode code, const char* msg )
00145 {
00146 std::string message( msg );
00147 message += " (MOAB Error Code: ";
00148 message += mbImpl->get_error_string( code );
00149 message += ")";
00150 return set_last_error( iBase_ERROR_MAP[code], message.c_str() );
00151 }
00152
00153 #endif