dune-grid  2.2.0
vertexorderfactory.hh
Go to the documentation of this file.
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