Simplification of bootstrap_stl code resulting in slightly better engine start up performance and compile time performance
This commit is contained in:
parent
1122f2c818
commit
4c015d7e44
@ -122,16 +122,6 @@ namespace chaiscript
|
|||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Add reversible_container concept to the given ContainerType
|
|
||||||
* http://www.sgi.com/tech/stl/ReversibleContainer.html
|
|
||||||
*/
|
|
||||||
template<typename ContainerType>
|
|
||||||
ModulePtr reversible_container_type(const std::string &, ModulePtr m = ModulePtr(new Module()))
|
|
||||||
{
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add random_access_container concept to the given ContainerType
|
* Add random_access_container concept to the given ContainerType
|
||||||
* http://www.sgi.com/tech/stl/RandomAccessContainer.html
|
* http://www.sgi.com/tech/stl/RandomAccessContainer.html
|
||||||
@ -139,7 +129,6 @@ namespace chaiscript
|
|||||||
template<typename ContainerType>
|
template<typename ContainerType>
|
||||||
ModulePtr random_access_container_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
ModulePtr random_access_container_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
||||||
{
|
{
|
||||||
reversible_container_type<ContainerType>(type, m);
|
|
||||||
typedef typename ContainerType::reference(ContainerType::*indexoper)(size_t);
|
typedef typename ContainerType::reference(ContainerType::*indexoper)(size_t);
|
||||||
|
|
||||||
//In the interest of runtime safety for the m, we prefer the at() method for [] access,
|
//In the interest of runtime safety for the m, we prefer the at() method for [] access,
|
||||||
@ -169,8 +158,6 @@ namespace chaiscript
|
|||||||
template<typename ContainerType>
|
template<typename ContainerType>
|
||||||
ModulePtr container_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
ModulePtr container_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
||||||
{
|
{
|
||||||
assignable_type<ContainerType>(type, m);
|
|
||||||
|
|
||||||
m->add(fun<size_t (ContainerType::*)() const>(&ContainerType::size), "size");
|
m->add(fun<size_t (ContainerType::*)() const>(&ContainerType::size), "size");
|
||||||
m->add(fun<bool (ContainerType::*)() const>(&ContainerType::empty), "empty");
|
m->add(fun<bool (ContainerType::*)() const>(&ContainerType::empty), "empty");
|
||||||
m->add(fun<void (ContainerType::*)()>(&ContainerType::clear), "clear");
|
m->add(fun<void (ContainerType::*)()>(&ContainerType::clear), "clear");
|
||||||
@ -178,19 +165,6 @@ namespace chaiscript
|
|||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Add forward container concept to the given ContainerType
|
|
||||||
* http://www.sgi.com/tech/stl/ForwardContainer.html
|
|
||||||
*/
|
|
||||||
template<typename ContainerType>
|
|
||||||
ModulePtr forward_container_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
|
||||||
{
|
|
||||||
input_range_type<ContainerType>(type, m);
|
|
||||||
container_type<ContainerType>(type, m);
|
|
||||||
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add default constructable concept to the given Type
|
* Add default constructable concept to the given Type
|
||||||
* http://www.sgi.com/tech/stl/DefaultConstructible.html
|
* http://www.sgi.com/tech/stl/DefaultConstructible.html
|
||||||
@ -245,9 +219,6 @@ namespace chaiscript
|
|||||||
template<typename ContainerType>
|
template<typename ContainerType>
|
||||||
ModulePtr sequence_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
ModulePtr sequence_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
||||||
{
|
{
|
||||||
forward_container_type<ContainerType>(type, m);
|
|
||||||
default_constructible_type<ContainerType>(type, m);
|
|
||||||
|
|
||||||
std::string insert_name;
|
std::string insert_name;
|
||||||
if (typeid(typename ContainerType::value_type) == typeid(Boxed_Value))
|
if (typeid(typename ContainerType::value_type) == typeid(Boxed_Value))
|
||||||
{
|
{
|
||||||
@ -269,9 +240,6 @@ namespace chaiscript
|
|||||||
template<typename ContainerType>
|
template<typename ContainerType>
|
||||||
ModulePtr back_insertion_sequence_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
ModulePtr back_insertion_sequence_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
||||||
{
|
{
|
||||||
sequence_type<ContainerType>(type, m);
|
|
||||||
|
|
||||||
|
|
||||||
typedef typename ContainerType::reference (ContainerType::*backptr)();
|
typedef typename ContainerType::reference (ContainerType::*backptr)();
|
||||||
|
|
||||||
m->add(fun(static_cast<backptr>(&ContainerType::back)), "back");
|
m->add(fun(static_cast<backptr>(&ContainerType::back)), "back");
|
||||||
@ -297,8 +265,6 @@ namespace chaiscript
|
|||||||
template<typename ContainerType>
|
template<typename ContainerType>
|
||||||
ModulePtr front_insertion_sequence_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
ModulePtr front_insertion_sequence_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
||||||
{
|
{
|
||||||
sequence_type<ContainerType>(type, m);
|
|
||||||
|
|
||||||
typedef typename ContainerType::reference (ContainerType::*frontptr)();
|
typedef typename ContainerType::reference (ContainerType::*frontptr)();
|
||||||
|
|
||||||
m->add(fun(static_cast<frontptr>(&ContainerType::front)), "front");
|
m->add(fun(static_cast<frontptr>(&ContainerType::front)), "front");
|
||||||
@ -315,44 +281,6 @@ namespace chaiscript
|
|||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* hopefully working List type
|
|
||||||
* http://www.sgi.com/tech/stl/List.html
|
|
||||||
*/
|
|
||||||
template<typename ListType>
|
|
||||||
ModulePtr list_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
|
||||||
{
|
|
||||||
m->add(user_type<ListType>(), type);
|
|
||||||
front_insertion_sequence_type<ListType>(type, m);
|
|
||||||
back_insertion_sequence_type<ListType>(type, m);
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a vector type with associated concepts
|
|
||||||
* http://www.sgi.com/tech/stl/Vector.html
|
|
||||||
*/
|
|
||||||
template<typename VectorType>
|
|
||||||
ModulePtr vector_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
|
||||||
{
|
|
||||||
m->add(user_type<VectorType>(), type);
|
|
||||||
random_access_container_type<VectorType>(type, m);
|
|
||||||
back_insertion_sequence_type<VectorType>(type, m);
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a vector type with associated concepts
|
|
||||||
* http://www.sgi.com/tech/stl/Vector.html
|
|
||||||
*/
|
|
||||||
template<typename ContainerType>
|
|
||||||
ModulePtr associative_container_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
|
||||||
{
|
|
||||||
forward_container_type<ContainerType>(type, m);
|
|
||||||
default_constructible_type<ContainerType>(type, m);
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* bootstrap a given PairType
|
* bootstrap a given PairType
|
||||||
* http://www.sgi.com/tech/stl/pair.html
|
* http://www.sgi.com/tech/stl/pair.html
|
||||||
@ -379,7 +307,6 @@ namespace chaiscript
|
|||||||
template<typename ContainerType>
|
template<typename ContainerType>
|
||||||
ModulePtr pair_associative_container_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
ModulePtr pair_associative_container_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
||||||
{
|
{
|
||||||
associative_container_type<ContainerType>(type, m);
|
|
||||||
pair_type<typename ContainerType::value_type>(type + "_Pair", m);
|
pair_type<typename ContainerType::value_type>(type + "_Pair", m);
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
@ -392,41 +319,11 @@ namespace chaiscript
|
|||||||
template<typename ContainerType>
|
template<typename ContainerType>
|
||||||
ModulePtr unique_associative_container_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
ModulePtr unique_associative_container_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
||||||
{
|
{
|
||||||
associative_container_type<ContainerType>(type, m);
|
|
||||||
m->add(fun<size_t (ContainerType::*)(const typename ContainerType::key_type &) const>(&ContainerType::count), "count");
|
m->add(fun<size_t (ContainerType::*)(const typename ContainerType::key_type &) const>(&ContainerType::count), "count");
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Add sorted associative container concept to the given ContainerType
|
|
||||||
* http://www.sgi.com/tech/stl/SortedAssociativeContainer.html
|
|
||||||
*/
|
|
||||||
template<typename ContainerType>
|
|
||||||
ModulePtr sorted_associative_container_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
|
||||||
{
|
|
||||||
typedef std::pair<typename ContainerType::iterator, typename ContainerType::iterator>
|
|
||||||
(ContainerType::*eq_range)(const typename ContainerType::key_type &);
|
|
||||||
|
|
||||||
reversible_container_type<ContainerType>(type, m);
|
|
||||||
associative_container_type<ContainerType>(type, m);
|
|
||||||
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add unique sorted associative container concept to the given ContainerType
|
|
||||||
* http://www.sgi.com/tech/stl/UniqueSortedAssociativeContainer.html
|
|
||||||
*/
|
|
||||||
template<typename ContainerType>
|
|
||||||
ModulePtr unique_sorted_associative_container_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
|
||||||
{
|
|
||||||
sorted_associative_container_type<ContainerType>(type, m);
|
|
||||||
unique_associative_container_type<ContainerType>(type, m);
|
|
||||||
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a MapType container
|
* Add a MapType container
|
||||||
* http://www.sgi.com/tech/stl/Map.html
|
* http://www.sgi.com/tech/stl/Map.html
|
||||||
@ -436,12 +333,57 @@ namespace chaiscript
|
|||||||
{
|
{
|
||||||
m->add(user_type<MapType>(), type);
|
m->add(user_type<MapType>(), type);
|
||||||
m->add(fun(&MapType::operator[]), "[]");
|
m->add(fun(&MapType::operator[]), "[]");
|
||||||
unique_sorted_associative_container_type<MapType>(type, m);
|
|
||||||
|
container_type<MapType>(type, m);
|
||||||
|
assignable_type<MapType>(type, m);
|
||||||
|
unique_associative_container_type<MapType>(type, m);
|
||||||
pair_associative_container_type<MapType>(type, m);
|
pair_associative_container_type<MapType>(type, m);
|
||||||
|
input_range_type<MapType>(type, m);
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hopefully working List type
|
||||||
|
* http://www.sgi.com/tech/stl/List.html
|
||||||
|
*/
|
||||||
|
template<typename ListType>
|
||||||
|
ModulePtr list_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
||||||
|
{
|
||||||
|
m->add(user_type<ListType>(), type);
|
||||||
|
|
||||||
|
front_insertion_sequence_type<ListType>(type, m);
|
||||||
|
back_insertion_sequence_type<ListType>(type, m);
|
||||||
|
sequence_type<ListType>(type, m);
|
||||||
|
container_type<ListType>(type, m);
|
||||||
|
default_constructible_type<ListType>(type, m);
|
||||||
|
assignable_type<ListType>(type, m);
|
||||||
|
input_range_type<ListType>(type, m);
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a vector type with associated concepts
|
||||||
|
* http://www.sgi.com/tech/stl/Vector.html
|
||||||
|
*/
|
||||||
|
template<typename VectorType>
|
||||||
|
ModulePtr vector_type(const std::string &type, ModulePtr m = ModulePtr(new Module()))
|
||||||
|
{
|
||||||
|
m->add(user_type<VectorType>(), type);
|
||||||
|
|
||||||
|
back_insertion_sequence_type<VectorType>(type, m);
|
||||||
|
sequence_type<VectorType>(type, m);
|
||||||
|
random_access_container_type<VectorType>(type, m);
|
||||||
|
container_type<VectorType>(type, m);
|
||||||
|
default_constructible_type<VectorType>(type, m);
|
||||||
|
assignable_type<VectorType>(type, m);
|
||||||
|
input_range_type<VectorType>(type, m);
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a String container
|
* Add a String container
|
||||||
* http://www.sgi.com/tech/stl/basic_string.html
|
* http://www.sgi.com/tech/stl/basic_string.html
|
||||||
@ -455,6 +397,10 @@ namespace chaiscript
|
|||||||
opers_comparison<String>(m);
|
opers_comparison<String>(m);
|
||||||
random_access_container_type<String>(type, m);
|
random_access_container_type<String>(type, m);
|
||||||
sequence_type<String>(type, m);
|
sequence_type<String>(type, m);
|
||||||
|
default_constructible_type<String>(type, m);
|
||||||
|
container_type<String>(type, m);
|
||||||
|
assignable_type<String>(type, m);
|
||||||
|
input_range_type<String>(type, m);
|
||||||
|
|
||||||
//Special case: add push_back to string (which doesn't support other back_insertion operations
|
//Special case: add push_back to string (which doesn't support other back_insertion operations
|
||||||
std::string push_back_name;
|
std::string push_back_name;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user