#ifndef __bootstrap_stl_hpp #define __bootstrap_stl_hpp__ #include "boxedcpp.hpp" template void bootstrap_reversible_container(Dispatch_Engine &system, const std::string &type) { } template void bootstrap_random_access_container(Dispatch_Engine &system, const std::string &type) { bootstrap_reversible_container(system, type); typedef typename ContainerType::reference(ContainerType::*indexoper)(size_t); //In the interest of runtime safety for the system, we prefer the at() method for [] access, //to throw an exception in an out of bounds condition. system.register_function( boost::function(indexoper(&ContainerType::at)), "[]"); system.register_function( boost::function(indexoper(&ContainerType::operator[])), "at"); } template void bootstrap_assignable(Dispatch_Engine &system, const std::string &type) { system.register_function( boost::function(&Assignable::operator=), "="); } template void bootstrap_container(Dispatch_Engine &system, const std::string &type) { bootstrap_assignable(system, type); system.register_function( boost::function(&ContainerType::size), "size"); system.register_function( boost::function(&ContainerType::size), "maxsize"); } template void bootstrap_forward_container(Dispatch_Engine &system, const std::string &type) { bootstrap_container(system, type); } template void bootstrap_default_constructible(Dispatch_Engine &system, const std::string &type) { system.register_function(build_constructor(), type); } template void bootstrap_sequence(Dispatch_Engine &system, const std::string &type) { bootstrap_forward_container(system, type); bootstrap_default_constructible(system, type); } template void bootstrap_back_insertion_sequence(Dispatch_Engine &system, const std::string &type) { bootstrap_sequence(system, type); typedef typename SequenceType::reference (SequenceType::*backptr)(); system.register_function(boost::function(backptr(&SequenceType::back)), "back"); system.register_function(boost::function(&SequenceType::push_back), "push_back"); system.register_function(boost::function(&SequenceType::pop_back), "pop_back"); } template void bootstrap_vector(Dispatch_Engine &system, const std::string &type) { system.register_type(type); bootstrap_random_access_container(system, type); bootstrap_back_insertion_sequence(system, type); } #endif