00001 //This file is part of the HexaMonkey project, a multimedia analyser 00002 //Copyright (C) 2013 Sevan Drapeau-Martin, Nicolas Fleury 00003 00004 //This program is free software; you can redistribute it and/or 00005 //modify it under the terms of the GNU General Public License 00006 //as published by the Free Software Foundation; either version 2 00007 //of the License, or (at your option) any later version. 00008 00009 //This program is distributed in the hope that it will be useful, 00010 //but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 //GNU General Public License for more details. 00013 00014 //You should have received a copy of the GNU General Public License 00015 //along with this program; if not, write to the Free Software 00016 //Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00017 00018 #ifndef OBJECTTYPETEMPLATE_H 00019 #define OBJECTTYPETEMPLATE_H 00020 00021 #include <string> 00022 #include <vector> 00023 #include <map> 00024 00025 #include "core/objecttype.h" 00026 #include "core/variant.h" 00027 00034 class ObjectTypeTemplate 00035 { 00036 public: 00037 ObjectTypeTemplate(const std::string &name, const std::vector<std::string>& parameterNames); 00038 ObjectTypeTemplate(const std::string &name); 00039 00043 const std::string& name() const; 00044 00048 int numberOfParameters() const; 00049 00055 const std::string& parameterName(int index) const; 00056 00064 bool isParameterPrivate(int index) const; 00065 00071 int parameterNumber(const std::string& name) const; 00072 00077 bool isNull() const; 00078 00082 void addParameter(const std::string& parameterName); 00083 00088 template<typename... Args> ObjectType operator()(Args... args) const 00089 { 00090 ObjectType type(*this); 00091 type.setParameters(args...); 00092 return type; 00093 } 00094 00095 00096 friend bool operator==(const ObjectTypeTemplate& a, const ObjectTypeTemplate& b); 00097 friend bool operator< (const ObjectTypeTemplate& a, const ObjectTypeTemplate& b); 00098 00099 private: 00100 std::string _name; 00101 std::vector<std::string> _parametersNames; 00102 std::map<std::string, int> _parametersNumbers; 00103 00104 ObjectTypeTemplate(const ObjectTypeTemplate&) = delete; 00105 ObjectTypeTemplate& operator=(const ObjectTypeTemplate&) = delete; 00106 }; 00107 00108 const ObjectTypeTemplate nullTypeTemplate(""); 00109 00110 bool operator!=(const ObjectTypeTemplate& a, const ObjectTypeTemplate& b); 00111 bool operator<=(const ObjectTypeTemplate& a, const ObjectTypeTemplate& b); 00112 00113 #endif // OBJECTTYPETEMPLATE_H