Branch data Line data Source code
1 : : #ifndef MBIMESH_HPP
2 : : #define MBIMESH_HPP
3 : :
4 : : #include "moab/Core.hpp"
5 : : #include <vector>
6 : : #include <algorithm>
7 : : #include <cstring>
8 : :
9 : : using namespace moab;
10 : :
11 : : /* map from MOAB's ErrorCode to tstt's */
12 : : extern "C" const iBase_ErrorType iBase_ERROR_MAP[MB_FAILURE + 1];
13 : :
14 : : class MBiMesh
15 : : {
16 : : private:
17 : : bool haveDeletedEntities;
18 : : bool iCreatedInterface;
19 : : std::vector< Tag > setHandleTags, entHandleTags;
20 : :
21 : : public:
22 : : MBiMesh( moab::Interface* mbImpl = NULL );
23 : :
24 : : virtual ~MBiMesh();
25 : : bool have_deleted_ents( bool reset )
26 : : {
27 : : bool result = haveDeletedEntities;
28 : : if( reset ) haveDeletedEntities = false;
29 : : return result;
30 : : }
31 : :
32 : : virtual ErrorCode delete_mesh();
33 : : virtual ErrorCode delete_entities( const EntityHandle*, const int );
34 : : virtual ErrorCode delete_entities( const Range& );
35 : : iBase_AdjacencyCost AdjTable[16];
36 : : moab::Interface* mbImpl;
37 : : int lastErrorType;
38 : : char lastErrorDescription[120];
39 : :
40 : : inline void note_set_handle_tag( Tag );
41 : : inline void note_ent_handle_tag( Tag );
42 : : inline void note_tag_destroyed( Tag );
43 : : inline bool is_set_handle_tag( Tag ) const;
44 : : inline bool is_ent_handle_tag( Tag ) const;
45 : :
46 : : inline int set_last_error( int, const char* );
47 : : inline int set_last_error( ErrorCode, const char* );
48 : : };
49 : :
50 : 188195 : static inline MBiMesh* mbimeshi_instance( iMesh_Instance instance )
51 : : {
52 : 188195 : return reinterpret_cast< MBiMesh* >( instance );
53 : : }
54 : : #define MBIMESHI mbimeshi_instance( instance )
55 : : #define MOABI MBIMESHI->mbImpl
56 : :
57 : 61 : inline MBiMesh::MBiMesh( Interface* impl )
58 [ + - ]: 61 : : haveDeletedEntities( false ), iCreatedInterface( false ), mbImpl( impl ), lastErrorType( iBase_SUCCESS )
59 : : {
60 : 61 : lastErrorDescription[0] = '\0';
61 : :
62 : : iBase_AdjacencyCost tmp_table[] = { iBase_ALL_ORDER_1, iBase_SOME_ORDER_1, iBase_SOME_ORDER_1,
63 : : iBase_ALL_ORDER_1, iBase_ALL_ORDER_1, iBase_UNAVAILABLE,
64 : : iBase_SOME_ORDER_LOGN, iBase_SOME_ORDER_LOGN, iBase_ALL_ORDER_1,
65 : : iBase_SOME_ORDER_LOGN, iBase_UNAVAILABLE, iBase_SOME_ORDER_LOGN,
66 : : iBase_ALL_ORDER_1, iBase_SOME_ORDER_LOGN, iBase_SOME_ORDER_LOGN,
67 : 61 : iBase_ALL_ORDER_1 };
68 : 61 : memcpy( AdjTable, tmp_table, 16 * sizeof( iBase_AdjacencyCost ) );
69 : :
70 [ + + ]: 61 : if( !mbImpl )
71 : : {
72 [ + - ][ + - ]: 60 : mbImpl = new Core();
73 : 60 : iCreatedInterface = true;
74 : : }
75 : 61 : }
76 : :
77 : 183 : inline MBiMesh::~MBiMesh()
78 : : {
79 [ + + ][ + - ]: 61 : if( iCreatedInterface ) delete mbImpl;
80 [ - + ]: 122 : }
81 : :
82 : 0 : inline ErrorCode MBiMesh::delete_mesh()
83 : : {
84 : 0 : haveDeletedEntities = true;
85 : 0 : return mbImpl->delete_mesh();
86 : : }
87 : :
88 : 0 : inline ErrorCode MBiMesh::delete_entities( const EntityHandle* a, const int n )
89 : : {
90 [ # # ]: 0 : if( n > 0 ) haveDeletedEntities = true;
91 : 0 : return mbImpl->delete_entities( a, n );
92 : : }
93 : :
94 : 0 : inline ErrorCode MBiMesh::delete_entities( const Range& r )
95 : : {
96 [ # # ]: 0 : if( !r.empty() ) haveDeletedEntities = true;
97 : 0 : return mbImpl->delete_entities( r );
98 : : }
99 : :
100 : 0 : void MBiMesh::note_set_handle_tag( Tag t )
101 : : {
102 : 0 : std::vector< Tag >::iterator i;
103 [ # # ]: 0 : i = std::lower_bound( entHandleTags.begin(), entHandleTags.end(), t );
104 [ # # ][ # # ]: 0 : if( i != entHandleTags.end() && *i == t ) entHandleTags.erase( i );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
105 [ # # ]: 0 : i = std::lower_bound( setHandleTags.begin(), setHandleTags.end(), t );
106 [ # # ][ # # ]: 0 : if( i == setHandleTags.end() || *i != t ) setHandleTags.insert( i, t );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
107 : 0 : }
108 : :
109 : 9 : void MBiMesh::note_ent_handle_tag( Tag t )
110 : : {
111 : 9 : std::vector< Tag >::iterator i;
112 [ + - ]: 9 : i = std::lower_bound( setHandleTags.begin(), setHandleTags.end(), t );
113 [ + - ][ - + ]: 9 : if( i != setHandleTags.end() && *i == t ) setHandleTags.erase( i );
[ # # ][ # # ]
[ + - ][ - + ]
[ # # ][ # # ]
114 [ + - ]: 9 : i = std::lower_bound( entHandleTags.begin(), entHandleTags.end(), t );
115 [ + - ][ + + ]: 9 : if( i == entHandleTags.end() || *i != t ) entHandleTags.insert( i, t );
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ # # ]
116 : 9 : }
117 : :
118 : 12 : void MBiMesh::note_tag_destroyed( Tag t )
119 : : {
120 : 12 : std::vector< Tag >::iterator i;
121 [ + - ]: 12 : i = std::lower_bound( setHandleTags.begin(), setHandleTags.end(), t );
122 [ + - ][ - + ]: 12 : if( i != setHandleTags.end() && *i == t ) setHandleTags.erase( i );
[ # # ][ # # ]
[ + - ][ - + ]
[ # # ][ # # ]
123 [ + - ]: 12 : i = std::lower_bound( entHandleTags.begin(), entHandleTags.end(), t );
124 [ + - ][ + + ]: 12 : if( i != entHandleTags.end() && *i == t ) entHandleTags.erase( i );
[ + - ][ + - ]
[ + - ][ + + ]
[ + - ][ # # ]
125 : 12 : }
126 : :
127 : 0 : bool MBiMesh::is_set_handle_tag( Tag t ) const
128 : : {
129 : 0 : return std::binary_search( setHandleTags.begin(), setHandleTags.end(), t );
130 : : }
131 : :
132 : 0 : bool MBiMesh::is_ent_handle_tag( Tag t ) const
133 : : {
134 : 0 : return std::binary_search( entHandleTags.begin(), entHandleTags.end(), t );
135 : : }
136 : :
137 : 115971 : int MBiMesh::set_last_error( int code, const char* msg )
138 : : {
139 : 115971 : std::strncpy( lastErrorDescription, msg, sizeof( lastErrorDescription ) );
140 : 115971 : lastErrorDescription[sizeof( lastErrorDescription ) - 1] = '\0';
141 : 115971 : return ( lastErrorType = static_cast< iBase_ErrorType >( code ) );
142 : : }
143 : :
144 : 18 : int MBiMesh::set_last_error( ErrorCode code, const char* msg )
145 : : {
146 [ + - ]: 18 : std::string message( msg );
147 [ + - ]: 18 : message += " (MOAB Error Code: ";
148 [ + - ][ + - ]: 18 : message += mbImpl->get_error_string( code );
149 [ + - ]: 18 : message += ")";
150 [ + - ]: 18 : return set_last_error( iBase_ERROR_MAP[code], message.c_str() );
151 : : }
152 : :
153 : : #endif
|