Branch data Line data Source code
1 : : /** \file MeshTag.cpp
2 : : * \author Jason Kraftcheck
3 : : * \date 2010-12-14
4 : : */
5 : :
6 : : #include "moab/Interface.hpp"
7 : : #include "MeshTag.hpp"
8 : : #include "SysUtil.hpp"
9 : : #include "moab/Error.hpp"
10 : : #include "moab/CN.hpp"
11 : : #include "Internals.hpp"
12 : :
13 : : namespace moab
14 : : {
15 : :
16 : 0 : inline static ErrorCode not_root_set( const std::string& /*name*/, EntityHandle /*h*/ )
17 : : {
18 : : // MB_TAG_NOT_FOUND could be a non-error condition, do not call MB_SET_ERR on it
19 : : // Print warning messages for debugging only
20 : : #if 0
21 : : MB_SET_ERR(MB_VARIABLE_DATA_LENGTH, "Cannot get/set mesh/global tag " << name << " on non-root-set " << CN::EntityTypeName(TYPE_FROM_HANDLE(h)) << " " << (unsigned long)ID_FROM_HANDLE(h));
22 : : #endif
23 : :
24 : 0 : return MB_TAG_NOT_FOUND;
25 : : }
26 : :
27 : 6 : inline static bool all_root_set( std::string name, const EntityHandle* array, size_t len )
28 : : {
29 [ + + ]: 12 : for( size_t i = 0; i < len; ++i )
30 : : {
31 [ - + ]: 6 : if( array[i] )
32 : : {
33 : 0 : not_root_set( name, array[i] );
34 : 0 : return false;
35 : : }
36 : : }
37 : :
38 : 6 : return true;
39 : : }
40 : :
41 : 0 : inline static ErrorCode not_found( const std::string& /*name*/ )
42 : : {
43 : : // MB_TAG_NOT_FOUND could be a non-error condition, do not call MB_SET_ERR on it
44 : : #if 0
45 : : fprintf(stderr, "[Warning]: No mesh tag %s value for global/mesh tag\n", name.c_str());
46 : : #endif
47 : :
48 : 0 : return MB_TAG_NOT_FOUND;
49 : : }
50 : :
51 : 5 : MeshTag::MeshTag( const char* name, int size, DataType type, const void* default_value, int default_value_size )
52 [ + - ]: 5 : : TagInfo( name, size, type, default_value, default_value_size )
53 : : {
54 : 5 : }
55 : :
56 [ - + ]: 20 : MeshTag::~MeshTag() {}
57 : :
58 : 9 : TagType MeshTag::get_storage_type() const
59 : : {
60 : 9 : return MB_TAG_MESH;
61 : : }
62 : :
63 : 5 : ErrorCode MeshTag::release_all_data( SequenceManager*, Error*, bool )
64 : : {
65 : 5 : return MB_SUCCESS;
66 : : }
67 : :
68 : 2 : ErrorCode MeshTag::get_data( const SequenceManager*, Error* /* error */, const EntityHandle* entities,
69 : : size_t num_entities, void* data ) const
70 : : {
71 [ - + ]: 2 : if( !all_root_set( get_name(), entities, num_entities ) ) return MB_TAG_NOT_FOUND;
72 : :
73 : : const void* ptr;
74 : : int len;
75 : :
76 [ + + ]: 2 : if( !mValue.empty() )
77 : : {
78 : 1 : ptr = &mValue[0];
79 : 1 : len = mValue.size();
80 : : }
81 [ + - ]: 1 : else if( get_default_value() )
82 : : {
83 : 1 : ptr = get_default_value();
84 : 1 : len = get_default_value_size();
85 : : }
86 : : else
87 : : {
88 : 0 : return not_found( get_name() );
89 : : }
90 : :
91 : 2 : SysUtil::setmem( data, ptr, len, num_entities );
92 : 2 : return MB_SUCCESS;
93 : : }
94 : :
95 : 0 : ErrorCode MeshTag::get_data( const SequenceManager*, Error* /* error */, const Range& r, void* ) const
96 : : {
97 [ # # ]: 0 : if( variable_length() )
98 : : {
99 [ # # ][ # # ]: 0 : MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "No length specified for variable-length tag " << get_name() << " value" );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
100 : : }
101 [ # # ]: 0 : else if( r.empty() )
102 : 0 : return MB_SUCCESS;
103 : : else
104 : 0 : return not_root_set( get_name(), r.front() );
105 : : }
106 : :
107 : 2 : ErrorCode MeshTag::get_data( const SequenceManager*, Error* /* error */, const EntityHandle* entities,
108 : : size_t num_entities, const void** data_ptrs, int* data_lengths ) const
109 : : {
110 : : const void* ptr;
111 : : int len;
112 : :
113 [ + - ]: 2 : if( !mValue.empty() )
114 : : {
115 : 2 : ptr = &mValue[0];
116 : 2 : len = mValue.size();
117 : : }
118 [ # # ]: 0 : else if( get_default_value() )
119 : : {
120 : 0 : ptr = get_default_value();
121 : 0 : len = get_default_value_size();
122 : : }
123 : : else
124 : : {
125 : 0 : return not_found( get_name() );
126 : : }
127 : :
128 [ + + ]: 4 : for( size_t i = 0; i < num_entities; ++i )
129 : : {
130 [ - + ]: 2 : if( entities[i] ) return not_root_set( get_name(), entities[i] ); // Not root set
131 : 2 : data_ptrs[i] = ptr;
132 [ + - ]: 2 : if( data_lengths ) data_lengths[i] = len;
133 : : }
134 : :
135 : 2 : return MB_SUCCESS;
136 : : }
137 : :
138 : 0 : ErrorCode MeshTag::get_data( const SequenceManager*, Error* /* error */, const Range& range, const void**, int* ) const
139 : : {
140 [ # # ]: 0 : if( range.empty() )
141 : 0 : return MB_SUCCESS;
142 : : else
143 : 0 : return not_root_set( get_name(), range.front() );
144 : : }
145 : :
146 : 2 : ErrorCode MeshTag::set_data( SequenceManager*, Error* /* error */, const EntityHandle* entities, size_t num_entities,
147 : : const void* data )
148 : : {
149 [ - + ]: 2 : if( variable_length() )
150 : : {
151 [ # # ][ # # ]: 0 : MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "No length specified for variable-length tag " << get_name() << " value" );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
152 : : }
153 [ - + ]: 2 : if( !all_root_set( get_name(), entities, num_entities ) ) return MB_TAG_NOT_FOUND;
154 : :
155 [ + - ]: 2 : if( num_entities > 0 )
156 : : {
157 : 2 : mValue.resize( get_size() );
158 : 2 : const unsigned char* bytes = reinterpret_cast< const unsigned char* >( data );
159 : 2 : memcpy( &mValue[0], bytes + get_size() * ( num_entities - 1 ), get_size() );
160 : : }
161 : :
162 : 2 : return MB_SUCCESS;
163 : : }
164 : :
165 : 0 : ErrorCode MeshTag::set_data( SequenceManager*, Error* /* error */, const Range& range, const void* )
166 : : {
167 [ # # ]: 0 : if( variable_length() )
168 : : {
169 [ # # ][ # # ]: 0 : MB_SET_ERR( MB_VARIABLE_DATA_LENGTH, "No length specified for variable-length tag " << get_name() << " value" );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
170 : : }
171 [ # # ]: 0 : else if( range.empty() )
172 : 0 : return MB_SUCCESS;
173 : : else
174 : 0 : return not_root_set( get_name(), range.front() );
175 : : }
176 : :
177 : 2 : ErrorCode MeshTag::set_data( SequenceManager*, Error* /* error */, const EntityHandle* entities, size_t num_entities,
178 : : void const* const* data_ptrs, const int* data_lengths )
179 : : {
180 [ - + ]: 2 : if( !all_root_set( get_name(), entities, num_entities ) ) return MB_TAG_NOT_FOUND;
181 : :
182 [ - + ][ # # ]: 2 : ErrorCode valid = validate_lengths( NULL, data_lengths, num_entities );MB_CHK_ERR( valid );
183 : :
184 [ + - ]: 2 : if( num_entities > 0 )
185 : : {
186 : 2 : mValue.resize( data_lengths[num_entities - 1] );
187 : 2 : memcpy( &mValue[0], data_ptrs[num_entities - 1], mValue.size() );
188 : : }
189 : :
190 : 2 : return MB_SUCCESS;
191 : : }
192 : :
193 : 0 : ErrorCode MeshTag::set_data( SequenceManager*, Error* /* error */, const Range& range, void const* const*, const int* )
194 : : {
195 [ # # ]: 0 : if( range.empty() )
196 : 0 : return MB_SUCCESS;
197 : : else
198 : 0 : return not_root_set( get_name(), range.front() );
199 : : }
200 : :
201 : 0 : ErrorCode MeshTag::clear_data( SequenceManager*, Error* /* error */, const EntityHandle* entities, size_t num_entities,
202 : : const void* value_ptr, int value_len )
203 : : {
204 [ # # ]: 0 : if( !all_root_set( get_name(), entities, num_entities ) ) return MB_TAG_NOT_FOUND;
205 : :
206 [ # # ][ # # ]: 0 : ErrorCode valid = validate_lengths( NULL, value_len ? &value_len : 0, 1 );MB_CHK_ERR( valid );
[ # # ]
207 : :
208 [ # # ]: 0 : if( num_entities > 0 )
209 : : {
210 : 0 : mValue.resize( value_len );
211 : 0 : memcpy( &mValue[0], value_ptr, value_len );
212 : : }
213 : :
214 : 0 : return MB_SUCCESS;
215 : : }
216 : :
217 : 0 : ErrorCode MeshTag::clear_data( SequenceManager*, Error* /* error */, const Range& range, const void*, int )
218 : : {
219 [ # # ]: 0 : if( range.empty() )
220 : 0 : return MB_SUCCESS;
221 : : else
222 : 0 : return not_root_set( get_name(), range.front() );
223 : : }
224 : :
225 : 0 : ErrorCode MeshTag::remove_data( SequenceManager*, Error* /* error */, const EntityHandle* entities,
226 : : size_t num_entities )
227 : : {
228 [ # # ]: 0 : if( !all_root_set( get_name(), entities, num_entities ) ) return MB_TAG_NOT_FOUND;
229 : :
230 [ # # ]: 0 : if( num_entities ) mValue.clear();
231 : :
232 : 0 : return MB_SUCCESS;
233 : : }
234 : :
235 : 0 : ErrorCode MeshTag::remove_data( SequenceManager*, Error* /* error */, const Range& range )
236 : : {
237 [ # # ]: 0 : if( range.empty() )
238 : 0 : return MB_SUCCESS;
239 : : else
240 : 0 : return not_root_set( get_name(), range.front() );
241 : : }
242 : :
243 : 0 : ErrorCode MeshTag::tag_iterate( SequenceManager*, Error* /* error */, Range::iterator& beg, const Range::iterator& end,
244 : : void*&, bool )
245 : : {
246 [ # # ]: 0 : if( beg == end )
247 : 0 : return MB_SUCCESS;
248 : : else
249 : 0 : return not_root_set( get_name(), *beg );
250 : : }
251 : :
252 : 0 : ErrorCode MeshTag::get_tagged_entities( const SequenceManager*, Range&, EntityType, const Range* ) const
253 : : {
254 : 0 : return MB_SUCCESS;
255 : : }
256 : :
257 : 0 : ErrorCode MeshTag::num_tagged_entities( const SequenceManager*, size_t&, EntityType, const Range* ) const
258 : : {
259 : 0 : return MB_SUCCESS;
260 : : }
261 : :
262 : 0 : ErrorCode MeshTag::find_entities_with_value( const SequenceManager*, Error*, Range&, const void*, int, EntityType,
263 : : const Range* ) const
264 : : {
265 : 0 : return MB_SUCCESS;
266 : : }
267 : :
268 : 0 : bool MeshTag::is_tagged( const SequenceManager*, EntityHandle h ) const
269 : : {
270 [ # # ][ # # ]: 0 : return ( 0 == h ) && ( !mValue.empty() );
271 : : }
272 : :
273 : 0 : ErrorCode MeshTag::get_memory_use( const SequenceManager*, unsigned long& total, unsigned long& per_entity ) const
274 : : {
275 : 0 : total = TagInfo::get_memory_use() + sizeof( *this ) + mValue.size();
276 : 0 : per_entity = 0;
277 : 0 : return MB_SUCCESS;
278 : : }
279 : :
280 [ + - ][ + - ]: 228 : } // namespace moab
|