77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
/* ----------------------------------------------------------------------------
 | 
						|
 | 
						|
 * 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 TemplateSubstitution.h
 | 
						|
 * @brief Auxiliary class for template substitutions
 | 
						|
 * @author Frank Dellaert
 | 
						|
 * @date Nov 13, 2014
 | 
						|
 **/
 | 
						|
 | 
						|
#pragma once
 | 
						|
 | 
						|
#include "ReturnType.h"
 | 
						|
#include <string>
 | 
						|
#include <iostream>
 | 
						|
 | 
						|
namespace wrap {
 | 
						|
 | 
						|
/**
 | 
						|
 * e.g. TemplateSubstitution("T", gtsam::Point2, gtsam::PriorFactorPoint2)
 | 
						|
 */
 | 
						|
class TemplateSubstitution {
 | 
						|
 | 
						|
  std::string templateArg_;
 | 
						|
  Qualified qualifiedType_, expandedClass_;
 | 
						|
 | 
						|
public:
 | 
						|
 | 
						|
  TemplateSubstitution(const std::string& a, const Qualified& t,
 | 
						|
      const Qualified& e) :
 | 
						|
      templateArg_(a), qualifiedType_(t), expandedClass_(e) {
 | 
						|
  }
 | 
						|
 | 
						|
  std::string expandedClassName() const {
 | 
						|
    return expandedClass_.name();
 | 
						|
  }
 | 
						|
 | 
						|
  // Substitute if needed
 | 
						|
  Qualified tryToSubstitite(const Qualified& type) const {
 | 
						|
    if (type.match(templateArg_))
 | 
						|
      return qualifiedType_;
 | 
						|
    else if (type.match("This"))
 | 
						|
      return expandedClass_;
 | 
						|
    else
 | 
						|
      return type;
 | 
						|
  }
 | 
						|
 | 
						|
  // Substitute if needed
 | 
						|
  ReturnType tryToSubstitite(const ReturnType& type) const {
 | 
						|
    ReturnType instType = type;
 | 
						|
    if (type.match(templateArg_))
 | 
						|
      instType.rename(qualifiedType_);
 | 
						|
    else if (type.match("This"))
 | 
						|
      instType.rename(expandedClass_);
 | 
						|
    return instType;
 | 
						|
  }
 | 
						|
 | 
						|
  friend std::ostream& operator<<(std::ostream& os,
 | 
						|
      const TemplateSubstitution& ts) {
 | 
						|
    os << ts.templateArg_ << '/' << ts.qualifiedType_.qualifiedName("::")
 | 
						|
        << " (" << ts.expandedClass_.qualifiedName("::") << ")";
 | 
						|
    return os;
 | 
						|
  }
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
} // \namespace wrap
 | 
						|
 |