Added Function Base class
parent
341ad9f288
commit
16ba6ba254
|
@ -0,0 +1,71 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
|
||||
* GTSAM Copyright 2010, Georgia Tech Research Corporation,
|
||||
* Atlanta, Georgia 30332-0415
|
||||
* All Rights Reserved
|
||||
* Authors: Frank Dellaert, et al. (see THANKS for the full author list)
|
||||
|
||||
* See LICENSE for the license information
|
||||
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* @file Function.ccp
|
||||
* @author Frank Dellaert
|
||||
* @date Nov 13, 2014
|
||||
**/
|
||||
|
||||
#include "Function.h"
|
||||
#include "utilities.h"
|
||||
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/algorithm/string.hpp>
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
using namespace std;
|
||||
using namespace wrap;
|
||||
|
||||
/* ************************************************************************* */
|
||||
void Function::addOverload(bool verbose, const std::string& name,
|
||||
const ArgumentList& args, const ReturnValue& retVal,
|
||||
const Qualified& instName) {
|
||||
|
||||
// Check if this overload is give to the correct method
|
||||
if (name_.empty())
|
||||
name_ = name;
|
||||
else if (name_ != name)
|
||||
throw std::runtime_error(
|
||||
"Function::addOverload: tried to add overload with name " + name
|
||||
+ " instead of expected " + name_);
|
||||
|
||||
// Check if this overload is give to the correct method
|
||||
if (templateArgValue_.empty())
|
||||
templateArgValue_ = instName;
|
||||
else if (templateArgValue_ != instName)
|
||||
throw std::runtime_error(
|
||||
"Function::addOverload: tried to add overload with template argument "
|
||||
+ instName.qualifiedName(":") + " instead of expected "
|
||||
+ templateArgValue_.qualifiedName(":"));
|
||||
|
||||
verbose_ = verbose;
|
||||
argLists.push_back(args);
|
||||
returnVals.push_back(retVal);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
vector<ArgumentList> Function::expandArgumentListsTemplate(
|
||||
const string& templateArg, const Qualified& qualifiedType,
|
||||
const Qualified& expandedClass) const {
|
||||
vector<ArgumentList> result;
|
||||
BOOST_FOREACH(const ArgumentList& argList, argLists) {
|
||||
ArgumentList instArgList = argList.expandTemplate(templateArg,
|
||||
qualifiedType, expandedClass);
|
||||
result.push_back(instArgList);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
|
@ -0,0 +1,109 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
|
||||
* GTSAM Copyright 2010, Georgia Tech Research Corporation,
|
||||
* Atlanta, Georgia 30332-0415
|
||||
* All Rights Reserved
|
||||
* Authors: Frank Dellaert, et al. (see THANKS for the full author list)
|
||||
|
||||
* See LICENSE for the license information
|
||||
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* @file Function.h
|
||||
* @brief Base class for global functions and methods
|
||||
* @author Frank Dellaert
|
||||
* @date Nov 13, 2014
|
||||
**/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Argument.h"
|
||||
#include "ReturnValue.h"
|
||||
#include "TypeAttributesTable.h"
|
||||
|
||||
#include <string>
|
||||
#include <list>
|
||||
|
||||
namespace wrap {
|
||||
|
||||
/// Function class
|
||||
struct Function {
|
||||
|
||||
/// Constructor creates empty object
|
||||
Function(bool verbose = true) :
|
||||
verbose_(verbose) {
|
||||
}
|
||||
|
||||
Function(const std::string& name, bool verbose = true) :
|
||||
verbose_(verbose), name_(name) {
|
||||
}
|
||||
|
||||
bool verbose_;
|
||||
std::string name_; ///< name of method
|
||||
Qualified templateArgValue_; ///< value of template argument if applicable
|
||||
std::vector<ArgumentList> argLists;
|
||||
std::vector<ReturnValue> returnVals;
|
||||
|
||||
// The first time this function is called, it initializes the class members
|
||||
// with those in rhs, but in subsequent calls it adds additional argument
|
||||
// lists as function overloads.
|
||||
void addOverload(bool verbose, const std::string& name,
|
||||
const ArgumentList& args, const ReturnValue& retVal,
|
||||
const Qualified& instName = Qualified());
|
||||
|
||||
std::vector<ArgumentList> expandArgumentListsTemplate(
|
||||
const std::string& templateArg, const Qualified& qualifiedType,
|
||||
const Qualified& expandedClass) const;
|
||||
};
|
||||
|
||||
// Templated checking functions
|
||||
// TODO: do this via polymorphism ?
|
||||
|
||||
template<class FUNCTION>
|
||||
FUNCTION expandMethodTemplate(const FUNCTION& method,
|
||||
const std::string& templateArg, const Qualified& qualifiedType,
|
||||
const Qualified& expandedClass) {
|
||||
// Create new instance
|
||||
FUNCTION instMethod = method;
|
||||
// substitute template in arguments
|
||||
instMethod.argLists = method.expandArgumentListsTemplate(templateArg,
|
||||
qualifiedType, expandedClass);
|
||||
// do the same for return types
|
||||
instMethod.returnVals = ReturnValue::ExpandTemplate(method.returnVals,
|
||||
templateArg, qualifiedType, expandedClass);
|
||||
// return new method
|
||||
return instMethod;
|
||||
}
|
||||
|
||||
// TODO use transform
|
||||
template<class FUNCTION>
|
||||
static std::map<std::string, FUNCTION> expandMethodTemplate(
|
||||
const std::map<std::string, FUNCTION>& methods,
|
||||
const std::string& templateArg, const Qualified& qualifiedType,
|
||||
const Qualified& expandedClass) {
|
||||
std::map<std::string, FUNCTION> result;
|
||||
typedef std::pair<const std::string, FUNCTION> NamedMethod;
|
||||
BOOST_FOREACH(NamedMethod namedMethod, methods) {
|
||||
namedMethod.second = expandMethodTemplate(namedMethod.second, templateArg,
|
||||
qualifiedType, expandedClass);
|
||||
result.insert(namedMethod);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
template<class T>
|
||||
inline void verifyReturnTypes(const std::vector<std::string>& validtypes,
|
||||
const std::map<std::string, T>& vt) {
|
||||
typedef typename std::map<std::string, T>::value_type NamedMethod;
|
||||
BOOST_FOREACH(const NamedMethod& namedMethod, vt) {
|
||||
const T& t = namedMethod.second;
|
||||
BOOST_FOREACH(const ReturnValue& retval, t.returnVals) {
|
||||
retval.type1.verify(validtypes, t.name_);
|
||||
if (retval.isPair)
|
||||
retval.type2.verify(validtypes, t.name_);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // \namespace wrap
|
||||
|
Loading…
Reference in New Issue