| 
									
										
										
										
											2012-07-14 05:54:48 +08:00
										 |  |  | /* ----------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * 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 Class.cpp | 
					
						
							|  |  |  |  * @author Frank Dellaert | 
					
						
							|  |  |  |  * @author Andrew Melim | 
					
						
							|  |  |  |  * @author Richard Roberts | 
					
						
							|  |  |  |  **/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "TypeAttributesTable.h"
 | 
					
						
							|  |  |  | #include "Class.h"
 | 
					
						
							| 
									
										
										
										
											2016-12-17 08:26:40 +08:00
										 |  |  | #include "ForwardDeclaration.h"
 | 
					
						
							| 
									
										
										
										
											2012-07-14 05:54:48 +08:00
										 |  |  | #include "utilities.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-30 02:38:51 +08:00
										 |  |  | #include <boost/range/adaptor/map.hpp>
 | 
					
						
							|  |  |  | #include <boost/range/algorithm/copy.hpp>
 | 
					
						
							| 
									
										
										
										
											2012-07-14 05:54:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-30 02:38:51 +08:00
										 |  |  | #include <iterator>     // std::ostream_iterator
 | 
					
						
							| 
									
										
										
										
											2012-07-14 05:54:48 +08:00
										 |  |  | using namespace std; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace wrap { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-30 02:38:51 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | const TypeAttributes& TypeAttributesTable::attributes(const string& key) const { | 
					
						
							|  |  |  |   try { | 
					
						
							|  |  |  |     return table_.at(key); | 
					
						
							|  |  |  |   } catch (const out_of_range& oor) { | 
					
						
							| 
									
										
										
										
											2014-11-30 02:47:45 +08:00
										 |  |  |     cerr << "TypeAttributesTable::attributes: key " << key | 
					
						
							|  |  |  |         << " not found. Valid keys are:\n"; | 
					
						
							| 
									
										
										
										
											2014-11-30 02:38:51 +08:00
										 |  |  |     using boost::adaptors::map_keys; | 
					
						
							|  |  |  |     ostream_iterator<string> out_it(cerr, "\n"); | 
					
						
							|  |  |  |     boost::copy(table_ | map_keys, out_it); | 
					
						
							|  |  |  |     throw runtime_error("Internal error in wrap"); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-11-30 02:38:51 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-25 08:24:25 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | void TypeAttributesTable::addType(const Qualified& cls) { | 
					
						
							|  |  |  |   if (!table_.insert(make_pair(cls.qualifiedName("::"), TypeAttributes(false))) | 
					
						
							|  |  |  |            .second) | 
					
						
							|  |  |  |     throw DuplicateDefinition("types " + cls.qualifiedName("::")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-30 02:38:51 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | void TypeAttributesTable::addClasses(const vector<Class>& classes) { | 
					
						
							| 
									
										
										
										
											2016-05-21 09:41:18 +08:00
										 |  |  |   for(const Class& cls: classes) { | 
					
						
							| 
									
										
										
										
											2014-11-30 02:38:51 +08:00
										 |  |  |     if (!table_.insert( | 
					
						
							|  |  |  |         make_pair(cls.qualifiedName("::"), TypeAttributes(cls.isVirtual))).second) | 
					
						
							|  |  |  |       throw DuplicateDefinition("class " + cls.qualifiedName("::")); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-30 02:38:51 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | void TypeAttributesTable::addForwardDeclarations( | 
					
						
							|  |  |  |     const vector<ForwardDeclaration>& forwardDecls) { | 
					
						
							| 
									
										
										
										
											2016-05-21 09:41:18 +08:00
										 |  |  |   for(const ForwardDeclaration& fwDec: forwardDecls) { | 
					
						
							| 
									
										
										
										
											2016-12-20 06:47:30 +08:00
										 |  |  |     if (!table_.insert(make_pair(fwDec.name(), TypeAttributes(fwDec.isVirtual))).second) | 
					
						
							|  |  |  |       throw DuplicateDefinition("forward defined class " + fwDec.name()); | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-11-30 02:38:51 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-30 02:38:51 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | void TypeAttributesTable::checkValidity(const vector<Class>& classes) const { | 
					
						
							| 
									
										
										
										
											2016-05-21 09:41:18 +08:00
										 |  |  |   for(const Class& cls: classes) { | 
					
						
							| 
									
										
										
										
											2014-12-01 16:48:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     boost::optional<string> parent = cls.qualifiedParent(); | 
					
						
							|  |  |  |     if (parent) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Check that class is virtual if it has a parent
 | 
					
						
							|  |  |  |       if (!cls.isVirtual) | 
					
						
							|  |  |  |         throw AttributeError(cls.qualifiedName("::"), | 
					
						
							|  |  |  |             "Has a base class so needs to be declared virtual, change to 'virtual class " | 
					
						
							|  |  |  |                 + cls.name() + " ...'"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Check that parent is virtual as well
 | 
					
						
							|  |  |  |       if (!table_.at(*parent).isVirtual) | 
					
						
							|  |  |  |         throw AttributeError(*parent, | 
					
						
							|  |  |  |             "Is the base class of " + cls.qualifiedName("::") | 
					
						
							|  |  |  |                 + ", so needs to be declared virtual"); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-11-30 02:38:51 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2012-07-14 05:54:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-12 09:46:49 +08:00
										 |  |  | } |