pelib
2.0.0
|
00001 /* 00002 Copyright 2015 Nicolas Melot 00003 00004 This file is part of Pelib. 00005 00006 Pelib is free software: you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License as published by 00008 the Free Software Foundation, either version 3 of the License, or 00009 (at your option) any later version. 00010 00011 Pelib is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU General Public License 00017 along with Pelib. If not, see <http://www.gnu.org/licenses/>. 00018 */ 00019 00020 00021 #include <set> 00022 00023 #include <pelib/CppData.hpp> 00024 #include <pelib/Set.hpp> 00025 #include <pelib/Scalar.hpp> 00026 #include <pelib/CastException.hpp> 00027 00028 #ifndef PELIB_CPPSET 00029 #define PELIB_CPPSET 00030 00031 namespace pelib 00032 { 00034 template <class Value> 00035 class CppSet: public CppData 00036 { 00037 typedef std::set<Value, std::less<Value>, std::allocator<Value> > SetType; 00038 00039 public: 00040 CppSet() : CppData() 00041 { 00042 // Do nothing 00043 } 00044 00046 virtual 00047 CppSet* 00048 clone() const 00049 { 00050 return new CppSet(); 00051 } 00052 00054 virtual 00055 void 00056 dump(std::ostream &o, const AlgebraData *data) const 00057 { 00058 const Set<Value> *set = dynamic_cast<const Set<Value>*>(data); 00059 if(set == NULL) throw CastException("parameter \"data\" was not of type \"Set<Value>\"."); 00060 00061 // Dummy key and value and string for their type 00062 Value value; 00063 std::string value_str = type_name(typeid(value)); 00064 00065 // Declare a map to contain values 00066 o << "std::set<" << value_str.c_str() << "> set_" << set->getName() << ";" << std::endl; 00067 00068 // Fill the map with values 00069 std::set<Value> stdset = set->getValues(); 00070 for(typename std::set<Value>::iterator iter = stdset.begin(); iter != stdset.end(); iter++) 00071 { 00072 value = *iter; 00073 //value_str = type_name(typeid(value)).c_str(); 00074 00075 o << "set_" << set->getName() << ".insert(" << value << ");" << std::endl; 00076 } 00077 00078 o << "pelib::Set<" << value_str.c_str() << "> " << set->getName() << "(\"" << set->getName() << "\", set_" << set->getName() << ");" << std::endl; 00079 } 00080 00081 protected: 00082 private: 00083 }; 00084 } 00085 00086 #endif