Branch data Line data Source code
1 : : /*
2 : : * MOAB, a Mesh-Oriented datABase, is a software component for creating,
3 : : * storing and accessing finite element mesh data.
4 : : *
5 : : * Copyright 2004 Sandia Corporation. Under the terms of Contract
6 : : * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
7 : : * retains certain rights in this software.
8 : : *
9 : : * This library is free software; you can redistribute it and/or
10 : : * modify it under the terms of the GNU Lesser General Public
11 : : * License as published by the Free Software Foundation; either
12 : : * version 2.1 of the License, or (at your option) any later version.
13 : : *
14 : : */
15 : :
16 : : /**\file MeshSetSequence.hpp
17 : : *\author Jason Kraftcheck ([email protected])
18 : : *\date 2007-04-30
19 : : */
20 : :
21 : : #ifndef MESH_SET_SEQUENCE_HPP
22 : : #define MESH_SET_SEQUENCE_HPP
23 : :
24 : : #include "EntitySequence.hpp"
25 : : #include "MeshSet.hpp"
26 : : #include "SequenceData.hpp"
27 : :
28 : : namespace moab
29 : : {
30 : :
31 : : class SequenceManager;
32 : :
33 : : class MeshSetSequence : public EntitySequence
34 : : {
35 : : public:
36 : : MeshSetSequence( EntityHandle start, EntityID count, const unsigned* flags, SequenceData* data );
37 : :
38 : : MeshSetSequence( EntityHandle start, EntityID count, unsigned flags, SequenceData* data );
39 : :
40 : : MeshSetSequence( EntityHandle start, EntityID count, const unsigned* flags, EntityID sequence_size );
41 : :
42 : : MeshSetSequence( EntityHandle start, EntityID count, unsigned flags, EntityID sequence_size );
43 : :
44 : : virtual ~MeshSetSequence();
45 : :
46 : : EntitySequence* split( EntityHandle here );
47 : :
48 : 0 : SequenceData* create_data_subset( EntityHandle, EntityHandle ) const
49 : : {
50 : 0 : return 0;
51 : : }
52 : :
53 : : ErrorCode pop_back( EntityID count );
54 : : ErrorCode pop_front( EntityID count );
55 : : ErrorCode push_back( EntityID count, const unsigned* flags );
56 : : ErrorCode push_front( EntityID count, const unsigned* flags );
57 : :
58 : : void get_const_memory_use( unsigned long& bytes_per_entity, unsigned long& size_of_sequence ) const;
59 : : unsigned long get_per_entity_memory_use( EntityHandle first, EntityHandle last ) const;
60 : :
61 : : inline MeshSet* get_set( EntityHandle h );
62 : : inline const MeshSet* get_set( EntityHandle h ) const;
63 : :
64 : : ErrorCode get_entities( EntityHandle set, std::vector< EntityHandle >& entities ) const;
65 : : ErrorCode get_entities( SequenceManager const* seqman, EntityHandle set, Range& entities, bool recursive ) const;
66 : : ErrorCode get_dimension( SequenceManager const* seqman, EntityHandle set, int dim,
67 : : std::vector< EntityHandle >& entities, bool recursive ) const;
68 : : ErrorCode get_dimension( SequenceManager const* seqman, EntityHandle set, int dim, Range& entities,
69 : : bool recursive ) const;
70 : : ErrorCode get_type( SequenceManager const* seqman, EntityHandle set, EntityType type,
71 : : std::vector< EntityHandle >& entities, bool recursive ) const;
72 : : ErrorCode get_type( SequenceManager const* seqman, EntityHandle set, EntityType type, Range& entities,
73 : : bool recursive ) const;
74 : :
75 : : ErrorCode num_entities( SequenceManager const* seqman, EntityHandle set, int& count, bool recursive ) const;
76 : : ErrorCode num_dimension( SequenceManager const* seqman, EntityHandle set, int dim, int& count,
77 : : bool recursive ) const;
78 : : ErrorCode num_type( SequenceManager const* seqman, EntityHandle set, EntityType type, int& count,
79 : : bool recursive ) const;
80 : :
81 : : ErrorCode get_parents( SequenceManager const* seqman, EntityHandle of, std::vector< EntityHandle >& parents,
82 : : int num_hops ) const;
83 : : ErrorCode get_children( SequenceManager const* seqman, EntityHandle of, std::vector< EntityHandle >& children,
84 : : int num_hops ) const;
85 : : ErrorCode get_contained_sets( SequenceManager const* seqman, EntityHandle of, std::vector< EntityHandle >& contents,
86 : : int num_hops ) const;
87 : : ErrorCode num_parents( SequenceManager const* seqman, EntityHandle of, int& number, int num_hops ) const;
88 : : ErrorCode num_children( SequenceManager const* seqman, EntityHandle of, int& number, int num_hops ) const;
89 : : ErrorCode num_contained_sets( SequenceManager const* seqman, EntityHandle of, int& number, int num_hops ) const;
90 : :
91 : : private:
92 : : enum SearchType
93 : : {
94 : : PARENTS,
95 : : CHILDREN,
96 : : CONTAINED
97 : : };
98 : :
99 : 13692 : MeshSetSequence( MeshSetSequence& split_from, EntityHandle split_at ) : EntitySequence( split_from, split_at ) {}
100 : :
101 : : void initialize( const unsigned* set_flags );
102 : :
103 : : ErrorCode get_parent_child_meshsets( EntityHandle meshset, SequenceManager const* set_sequences,
104 : : std::vector< EntityHandle >& results, int num_hops,
105 : : SearchType link_type ) const;
106 : :
107 : : static ErrorCode recursive_get_sets( EntityHandle start_set, SequenceManager const* set_sequences,
108 : : std::vector< const MeshSet* >* sets_out = 0, Range* set_handles_out = 0,
109 : : std::vector< EntityHandle >* set_handle_vect_out = 0 );
110 : : static ErrorCode recursive_get_sets( EntityHandle start_set, SequenceManager* set_sequences,
111 : : std::vector< MeshSet* >& sets_out );
112 : :
113 : : enum
114 : : {
115 : : SET_SIZE = sizeof( MeshSet )
116 : : };
117 : :
118 : 294150 : inline const unsigned char* array() const
119 : : {
120 : 294150 : return reinterpret_cast< const unsigned char* >( data()->get_sequence_data( 0 ) );
121 : : }
122 : :
123 : 278529 : inline unsigned char* array()
124 : : {
125 : 278529 : return reinterpret_cast< unsigned char* >( data()->get_sequence_data( 0 ) );
126 : : }
127 : :
128 : 32597 : inline void allocate_set( unsigned flags, EntityID index )
129 : : {
130 : 32597 : unsigned char* const ptr = array() + index * SET_SIZE;
131 [ + - ][ + - ]: 32597 : new( ptr ) MeshSet( flags );
132 : 32597 : }
133 : :
134 : 32411 : inline void deallocate_set( EntityID index )
135 : : {
136 : 32411 : MeshSet* set = reinterpret_cast< MeshSet* >( array() + SET_SIZE * index );
137 : 32411 : set->~MeshSet();
138 : 32411 : }
139 : : };
140 : :
141 : 213521 : inline MeshSet* MeshSetSequence::get_set( EntityHandle h )
142 : : {
143 : 213521 : return reinterpret_cast< MeshSet* >( array() + SET_SIZE * ( h - data()->start_handle() ) );
144 : : }
145 : 294150 : inline const MeshSet* MeshSetSequence::get_set( EntityHandle h ) const
146 : : {
147 : 294150 : return reinterpret_cast< const MeshSet* >( array() + SET_SIZE * ( h - data()->start_handle() ) );
148 : : }
149 : :
150 : : } // namespace moab
151 : :
152 : : #endif
|