Parametrizable.h
Go to the documentation of this file.
00001 // kate: replace-tabs off; indent-width 4; indent-mode normal
00002 // vim: ts=4:sw=4:noexpandtab
00003 /*
00004 
00005 Copyright (c) 2010--2012,
00006 François Pomerleau and Stephane Magnenat, ASL, ETHZ, Switzerland
00007 You can contact the authors at <f dot pomerleau at gmail dot com> and
00008 <stephane at magnenat dot net>
00009 
00010 All rights reserved.
00011 
00012 Redistribution and use in source and binary forms, with or without
00013 modification, are permitted provided that the following conditions are met:
00014     * Redistributions of source code must retain the above copyright
00015       notice, this list of conditions and the following disclaimer.
00016     * Redistributions in binary form must reproduce the above copyright
00017       notice, this list of conditions and the following disclaimer in the
00018       documentation and/or other materials provided with the distribution.
00019     * Neither the name of the <organization> nor the
00020       names of its contributors may be used to endorse or promote products
00021       derived from this software without specific prior written permission.
00022 
00023 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
00024 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
00025 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00026 DISCLAIMED. IN NO EVENT SHALL ETH-ASL BE LIABLE FOR ANY
00027 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00028 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00029 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00030 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00031 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00032 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00033 
00034 */
00035 
00036 #ifndef __POINTMATCHER_PARAMETRIZABLE_H
00037 #define __POINTMATCHER_PARAMETRIZABLE_H
00038 
00039 #include <stdexcept>
00040 #include <vector>
00041 #include <map>
00042 #include <set>
00043 #include <string>
00044 #include <boost/lexical_cast.hpp>
00045 #include <limits>
00046 #define BOOST_ASSIGN_MAX_PARAMS 6
00047 #include <boost/assign/list_inserter.hpp>
00048 
00049 
00050 namespace PointMatcherSupport
00051 {       
00053         template<typename Target>
00054         inline Target lexical_cast_scalar_to_string(const std::string& arg)
00055         {
00056                 if (arg == "inf")
00057                         return std::numeric_limits<Target>::infinity();
00058                 else if (arg == "-inf")
00059                         return -std::numeric_limits<Target>::infinity();
00060                 else if (arg == "nan")
00061                         return std::numeric_limits<Target>::quiet_NaN();
00062                 else
00063                         return boost::lexical_cast<Target>(arg);
00064         }
00065 
00067         template<typename Target>
00068         inline Target lexical_cast_scalar_to_string(const char*& arg)
00069         {
00070                 return lexical_cast_scalar_to_string<Target>(std::string(arg));
00071         }
00072 
00073         
00075         template<typename Target, typename Source>
00076         inline Target lexical_cast(const Source& arg)
00077         {
00078                 return boost::lexical_cast<Target>(arg);
00079         }
00080         
00082         template<>
00083         inline float lexical_cast(const std::string& arg) { return lexical_cast_scalar_to_string<float>(arg); }
00085         template<>
00086         inline double lexical_cast(const std::string& arg) { return lexical_cast_scalar_to_string<double>(arg); }
00087         
00088         //
00089         
00091         template<typename S>
00092         std::string toParam(const S& value)
00093         {
00094                 return lexical_cast<std::string>(value);
00095         }
00096         
00098         struct Parametrizable
00099         {
00101                 struct InvalidParameter: std::runtime_error
00102                 {
00103                         InvalidParameter(const std::string& reason);
00104                 };
00105                 
00107                 typedef bool(*LexicalComparison)(std::string a, std::string b);
00108                 
00110                 template<typename S>
00111                 static bool Comp(std::string a, std::string b)
00112                 {
00113                         return lexical_cast<S>(a) < lexical_cast<S>(b);
00114                 }
00115                 
00117                 struct ParameterDoc
00118                 {
00119                         std::string name; 
00120                         std::string doc; 
00121                         std::string defaultValue; 
00122                         std::string minValue; 
00123                         std::string maxValue; 
00124                         LexicalComparison comp; 
00125                         
00126                         /*
00127                         This code is beautiful, this code is correct, this code does not work ;-(
00128                         Blame gcc bug 9050 (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=9050), shame
00129                         on them forever and beyond. People being laaaazzzy adopters, I'm forced to use
00130                         something that works on gcc 4.4.
00131                         
00132                         template<typename S>
00133                         ParameterDoc(const std::string& name, const std::string& doc, const S defaultValue, const S minValue, const S maxValue = std::numeric_limits<S>::max());
00134                         template<typename S>
00135                         ParameterDoc(const std::string& name, const std::string& doc, const S defaultValue);
00136                         */
00137                         ParameterDoc(const std::string& name, const std::string& doc, const std::string& defaultValue, const std::string& minValue, const std::string& maxValue, LexicalComparison comp);
00138                         ParameterDoc(const std::string& name, const std::string& doc, const std::string& defaultValue);
00139                         
00140                         friend std::ostream& operator<< (std::ostream& o, const ParameterDoc& p);
00141                 };
00142                 
00144                 typedef std::vector<ParameterDoc> ParametersDoc;
00145                 
00146                 /*
00147                 Again, not used because fo gcc bug 9050
00148                 struct Parameter: public std::string
00149                 {
00150                         template<typename S>
00151                         Parameter(const S value);
00152                         Parameter(){}
00153                 };
00154                 */
00155                 typedef std::string Parameter; 
00156                 typedef std::map<std::string, Parameter> Parameters; 
00157                 typedef std::set<std::string> ParametersUsed; 
00158                 
00159                 const std::string className; 
00160                 const ParametersDoc parametersDoc; 
00161                 Parameters parameters; 
00162                 ParametersUsed parametersUsed; 
00163                 
00164                 Parametrizable();
00165                 Parametrizable(const std::string& className, const ParametersDoc paramsDoc, const Parameters& params);
00166                 virtual ~Parametrizable();
00167                 
00168                 std::string getParamValueString(const std::string& paramName);
00169                 
00171                 template<typename S>
00172                 S get(const std::string& paramName) { return lexical_cast<S>(getParamValueString(paramName)); }
00173                 
00174                 friend std::ostream& operator<< (std::ostream& o, const Parametrizable& p);
00175         };
00176         std::ostream& operator<< (std::ostream& o, const Parametrizable::ParametersDoc& p);
00177 } // namespace PointMatcherSupport
00178 
00179 #endif // __POINTMATCHER_PARAMETRIZABLE_H


libpointmatcher
Author(s):
autogenerated on Thu Jun 20 2019 19:51:32