Go to the documentation of this file.00001 #ifndef VIENNAGRID_ELEMENT_KEY_HPP
00002 #define VIENNAGRID_ELEMENT_KEY_HPP
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <map>
00023 #include <iostream>
00024 #include <algorithm>
00025
00026 #include "viennagrid/forwards.h"
00027 #include "viennagrid/element.hpp"
00028 #include "viennagrid/topology/point.hpp"
00029
00034 namespace viennagrid
00035 {
00036
00038
00040 template <typename ConfigType,
00041 typename ElementType,
00042 typename IDHandler = typename result_of::element_id_handler<ConfigType, point_tag>::type>
00043 struct ElementKeyStorageType
00044 {
00045 typedef ElementType * result_type;
00046 };
00047
00048 template <typename ConfigType, typename ElementType>
00049 struct ElementKeyStorageType<ConfigType, ElementType, integral_id>
00050 {
00051 typedef long result_type;
00052 };
00053
00054
00055
00057 template <typename ConfigType, typename ElementType>
00058 class element_key
00059 {
00060 typedef typename ElementType::tag ElementTag;
00061 typedef typename ElementKeyStorageType<ConfigType, ElementType>::result_type StorageType;
00062 public:
00063 element_key( ElementType & el2) : vertexIDs(topology::bndcells<ElementTag, 0>::num)
00064 {
00065 typedef typename result_of::ncell_range<ElementType, 0>::type VertexRange;
00066 typedef typename result_of::iterator<ElementType, 0>::type VertexIterator;
00067 long i = 0;
00068 VertexRange vertices_el2 = ncells<0>(el2);
00069 for (VertexIterator vit = vertices_el2.begin();
00070 vit != vertices_el2.end();
00071 ++vit, ++i)
00072 vertexIDs[i] = static_cast<StorageType>(vit->id());
00073
00074 std::sort(vertexIDs.begin(), vertexIDs.end());
00075 }
00076
00077 element_key( const element_key & ek2) : vertexIDs(ek2.vertexIDs.size())
00078 {
00079
00080 for (typename std::vector<StorageType>::size_type i=0; i<ek2.vertexIDs.size(); ++i)
00081 vertexIDs[i] = ek2.vertexIDs[i];
00082 }
00083
00084 bool operator < (element_key const & epc2) const
00085 {
00086 for (long i=0; i<topology::bndcells<ElementTag, 0>::num; ++i)
00087 {
00088 if ( vertexIDs[i] > epc2.vertexIDs[i] )
00089 return false;
00090 else if ( vertexIDs[i] < epc2.vertexIDs[i] )
00091 return true;
00092 }
00093 return false;
00094 }
00095
00096 void print() const
00097 {
00098 for (typename std::vector<StorageType>::const_iterator vit = vertexIDs.begin();
00099 vit != vertexIDs.end();
00100 ++vit)
00101 std::cout << *vit << " ";
00102 std::cout << std::endl;
00103 }
00104
00105 private:
00106 std::vector< StorageType > vertexIDs;
00107 };
00108
00109
00110
00111
00112
00113 }
00114 #endif