ResourceManagerT.cc 7.95 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
/*===========================================================================*\
 *                                                                           *
 *                            OpenVolumeMesh                                 *
 *        Copyright (C) 2011 by Computer Graphics Group, RWTH Aachen         *
 *                        www.openvolumemesh.org                             *
 *                                                                           *
 *---------------------------------------------------------------------------*
 *  This file is part of OpenVolumeMesh.                                     *
 *                                                                           *
 *  OpenVolumeMesh is free software: you can redistribute it and/or modify   *
 *  it under the terms of the GNU Lesser General Public License as           *
 *  published by the Free Software Foundation, either version 3 of           *
 *  the License, or (at your option) any later version with the              *
 *  following exceptions:                                                    *
 *                                                                           *
 *  If other files instantiate templates or use macros                       *
 *  or inline functions from this file, or you compile this file and         *
 *  link it with other files to produce an executable, this file does        *
 *  not by itself cause the resulting executable to be covered by the        *
 *  GNU Lesser General Public License. This exception does not however       *
 *  invalidate any other reasons why the executable file might be            *
 *  covered by the GNU Lesser General Public License.                        *
 *                                                                           *
 *  OpenVolumeMesh is distributed in the hope that it will be useful,        *
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *
 *  GNU Lesser General Public License for more details.                      *
 *                                                                           *
 *  You should have received a copy of the GNU LesserGeneral Public          *
 *  License along with OpenVolumeMesh.  If not,                              *
 *  see <http://www.gnu.org/licenses/>.                                      *
 *                                                                           *
\*===========================================================================*/

/*===========================================================================*\
 *                                                                           *
 *   $Revision$                                                         *
 *   $Date$                    *
 *   $LastChangedBy$                                                *
 *                                                                           *
\*===========================================================================*/

#define RESOURCEMANAGERT_CC

#include "ResourceManager.hh"
#include "PropertyDefines.hh"

namespace OpenVolumeMesh {

template<class T>
51
VertexPropertyT<T> ResourceManager::request_vertex_property(const std::string& _name, const T _def) {
52

53
    return request_property<std::vector<BaseProperty*>,VertexPropertyT<T>,VertexPropHandle,T>(vertex_props_, _name, n_vertices(), _def);
54 55 56
}

template<class T>
57
EdgePropertyT<T> ResourceManager::request_edge_property(const std::string& _name, const T _def) {
58

59
    return request_property<std::vector<BaseProperty*>,EdgePropertyT<T>,EdgePropHandle,T>(edge_props_, _name, n_edges(), _def);
60 61 62
}

template<class T>
63
HalfEdgePropertyT<T> ResourceManager::request_halfedge_property(const std::string& _name, const T _def) {
64

65
    return request_property<std::vector<BaseProperty*>,HalfEdgePropertyT<T>,HalfEdgePropHandle,T>(halfedge_props_, _name, n_edges()*2u, _def);
66 67 68
}

template<class T>
69
FacePropertyT<T> ResourceManager::request_face_property(const std::string& _name, const T _def) {
70

71
    return request_property<std::vector<BaseProperty*>,FacePropertyT<T>,FacePropHandle,T>(face_props_, _name, n_faces(), _def);
72 73 74
}

template<class T>
75
HalfFacePropertyT<T> ResourceManager::request_halfface_property(const std::string& _name, const T _def) {
76

77
    return request_property<std::vector<BaseProperty*>,HalfFacePropertyT<T>,HalfFacePropHandle,T>(halfface_props_, _name, n_faces()*2u, _def);
78 79 80
}

template<class T>
81
CellPropertyT<T> ResourceManager::request_cell_property(const std::string& _name, const T _def) {
82

83
    return request_property<std::vector<BaseProperty*>,CellPropertyT<T>,CellPropHandle,T>(cell_props_, _name, n_cells(), _def);
84 85 86
}

template<class T>
87
MeshPropertyT<T> ResourceManager::request_mesh_property(const std::string& _name, const T _def) {
88

89
    return request_property<std::vector<BaseProperty*>,MeshPropertyT<T>,MeshPropHandle,T>(mesh_props_, _name, 1, _def);
90 91
}

92 93
template<class StdVecT, class PropT, class HandleT, class T>
PropT ResourceManager::request_property(StdVecT& _vec, const std::string& _name, size_t _size, const T _def) {
94

Mike Kremer's avatar
Mike Kremer committed
95
    if(!_name.empty()) {
96 97
        for(typename StdVecT::iterator it = _vec.begin();
                it != _vec.end(); ++it) {
Mike Kremer's avatar
Mike Kremer committed
98
            if((*it)->name() == _name) {
99
                PropT* prop = dynamic_cast<PropT*>(*it);
100
                if(prop != NULL) return *prop;
Mike Kremer's avatar
Mike Kremer committed
101
            }
102 103 104
        }
    }

105
    HandleT handle(_vec.size());
106

107
    PropT* prop = new PropT(_name, *this, handle, _def);
108
    prop->resize(_size);
109 110

    // Store property pointer
111
    _vec.push_back(prop);
112 113 114 115

    return *prop;
}

Mike Kremer's avatar
Mike Kremer committed
116
template<class T>
117 118
void ResourceManager::set_persistent(VertexPropertyT<T>& _prop, bool _flag) {

119
    set_persistentT(_prop, _flag);
Mike Kremer's avatar
Mike Kremer committed
120 121 122
}

template<class T>
123 124
void ResourceManager::set_persistent(EdgePropertyT<T>& _prop, bool _flag) {

125
    set_persistentT(_prop, _flag);
Mike Kremer's avatar
Mike Kremer committed
126 127 128
}

template<class T>
129 130
void ResourceManager::set_persistent(HalfEdgePropertyT<T>& _prop, bool _flag) {

131
    set_persistentT(_prop, _flag);
Mike Kremer's avatar
Mike Kremer committed
132 133 134
}

template<class T>
135 136
void ResourceManager::set_persistent(FacePropertyT<T>& _prop, bool _flag) {

137
    set_persistentT(_prop, _flag);
Mike Kremer's avatar
Mike Kremer committed
138 139 140
}

template<class T>
141 142
void ResourceManager::set_persistent(HalfFacePropertyT<T>& _prop, bool _flag) {

143
    set_persistentT(_prop, _flag);
Mike Kremer's avatar
Mike Kremer committed
144 145 146
}

template<class T>
147 148
void ResourceManager::set_persistent(CellPropertyT<T>& _prop, bool _flag) {

149
    set_persistentT(_prop, _flag);
Mike Kremer's avatar
Mike Kremer committed
150 151 152
}

template<class T>
153 154
void ResourceManager::set_persistent(MeshPropertyT<T>& _prop, bool _flag) {

155 156 157 158 159
    set_persistentT(_prop, _flag);
}

template<class PropT>
void ResourceManager::set_persistentT(PropT& _prop, bool _flag) {
160

161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
    if(_flag == _prop->persistent()) return;

    _prop->set_persistent(_flag);
}

template<class StdVecT>
void ResourceManager::remove_property(StdVecT& _vec, size_t _idx) {

    (*(_vec.begin() + _idx))->lock();
    delete *(_vec.begin() + _idx);
    _vec.erase(_vec.begin() + _idx);
    size_t n = _vec.size();
    for(size_t i = 0; i < n; ++i) {
        _vec[i]->set_handle(OpenVolumeMeshHandle(i));
    }
}

template<class StdVecT>
179
void ResourceManager::resize_props(StdVecT& _vec, size_t _n) {
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198

    for(typename StdVecT::iterator it = _vec.begin();
            it != _vec.end(); ++it) {
        (*it)->resize(_n);
    }
}

template<class StdVecT>
void ResourceManager::entity_deleted(StdVecT& _vec, const OpenVolumeMeshHandle& _h) {

    for(typename StdVecT::iterator it = _vec.begin();
            it != _vec.end(); ++it) {
        (*it)->delete_element(_h.idx());
    }
}

template<class StdVecT>
void ResourceManager::clearVec(StdVecT& _vec) {

199
    StdVecT newVec;
200 201 202
    for(typename StdVecT::iterator it = _vec.begin();
            it != _vec.end(); ++it) {
        if(!(*it)->persistent()) {
203 204 205 206 207 208
#ifndef NDEBUG
            std::cerr << "Keeping property \"" << (*it)->name()
                      << "\" since it is still in use!" << std::endl;
#endif
            (*it)->resize(0);
            newVec.push_back(*it);
209
        }
210 211
        else
            delete *it;
212 213
    }

214
    _vec = newVec;
Mike Kremer's avatar
Mike Kremer committed
215 216
}

217
} // Namespace OpenVolumeMesh