dune-grid
2.2.0
|
00001 // -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- 00002 // vi: set et ts=8 sw=2 sts=2: 00003 00004 #ifndef DUNE_GRID_UTILITY_VERTEXORDERFACTORY_HH 00005 #define DUNE_GRID_UTILITY_VERTEXORDERFACTORY_HH 00006 00007 #include <algorithm> 00008 #include <cstddef> 00009 #include <functional> 00010 #include <vector> 00011 00012 #include <dune/geometry/referenceelements.hh> 00013 #include <dune/geometry/generalvertexorder.hh> 00014 00015 namespace Dune { 00016 00018 00029 template<class IdSet, class Index = std::size_t> 00030 class VertexOrderByIdFactory { 00031 const IdSet& idset; 00032 00033 public: 00035 template<std::size_t dim> 00036 struct VertexOrder { 00038 typedef GeneralVertexOrder<dim, Index> type; 00039 }; 00040 00042 00051 VertexOrderByIdFactory(const IdSet &idset_) : idset(idset_) { } 00052 00054 00060 template<typename Element> 00061 typename VertexOrder<Element::mydimension>::type 00062 make(const Element &e) const { 00063 typedef GenericReferenceElements< 00064 typename Element::ctype, 00065 Element::mydimension 00066 > RefElems; 00067 std::size_t size = 00068 RefElems::general(e.type()).size(Element::mydimension); 00069 00070 std::vector<typename IdSet::IdType> ids(size); 00071 for(std::size_t i = 0; i < size; ++i) 00072 ids[i] = idset.subId(e, i, Element::mydimension); 00073 return GeneralVertexOrder<Element::mydimension, Index> 00074 (e.type(), ids.begin(), ids.end()); 00075 } 00076 }; 00077 00078 } // namespace Dune 00079 00080 #endif // DUNE_GRID_UTILITY_VERTEXORDERFACTORY_HH