From 9c8e4dd535051d18a915c9ad318a2541622fc762 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Thu, 9 Jul 2009 02:08:16 +0000 Subject: [PATCH] Add insert_at and erase_at for vector --- chaiscript/chaiscript_prelude.hpp | 7 +++- dispatchkit/bootstrap_stl.hpp | 63 +++++++++++++++++++++++++++---- dispatchkit/boxed_value.hpp | 12 ++++++ 3 files changed, 72 insertions(+), 10 deletions(-) diff --git a/chaiscript/chaiscript_prelude.hpp b/chaiscript/chaiscript_prelude.hpp index 3bccda7e..6409e0e3 100644 --- a/chaiscript/chaiscript_prelude.hpp +++ b/chaiscript/chaiscript_prelude.hpp @@ -38,8 +38,11 @@ def min(a, b) { if (a(type+"_Iterator_Pair"); - register_function(system, &Input_Range::empty, "empty"); register_function(system, &Input_Range::pop_front, "pop_front"); register_function(system, &Input_Range::front, "front"); @@ -108,10 +107,8 @@ namespace dispatchkit { bootstrap_assignable(system, type); - system.register_function( - boost::function(&ContainerType::size), "size"); - system.register_function( - boost::function(&ContainerType::size), "maxsize"); + register_function(system, &ContainerType::size, "size"); + register_function(system, &ContainerType::max_size, "max_size"); register_function(system, &ContainerType::empty, "empty"); } @@ -128,11 +125,52 @@ namespace dispatchkit system.register_function(build_constructor(), type); } + template + void insert_at(Type &container, int pos, const typename Type::value_type &v) + { + typename Type::iterator itr = container.begin(); + typename Type::iterator end = container.end(); + + if (pos < 0 || std::distance(itr, end) < pos) + { + throw std::range_error("Cannot insert past end of range"); + } + + std::advance(itr, pos); + container.insert(itr, v); + } + + template + void erase_at(Type &container, int pos) + { + typename Type::iterator itr = container.begin(); + typename Type::iterator end = container.end(); + + if (pos < 0 || std::distance(itr, end) < (pos-1)) + { + throw std::range_error("Cannot erase past end of range"); + } + + std::advance(itr, pos); + container.erase(itr); + } + template void bootstrap_sequence(Dispatch_Engine &system, const std::string &type) { bootstrap_forward_container(system, type); bootstrap_default_constructible(system, type); + + std::string insert_name; + if (typeid(typename SequenceType::value_type) == typeid(Boxed_Value)) + { + insert_name = "insert_ref_at"; + } else { + insert_name = "insert_at"; + } + + register_function(system, &insert_at, insert_name); + register_function(system, &erase_at, "erase_at"); } template @@ -144,8 +182,17 @@ namespace dispatchkit 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_ref"); - system.register_function(boost::function(&SequenceType::pop_back), "pop_back"); + + std::string push_back_name; + if (typeid(typename SequenceType::value_type) == typeid(Boxed_Value)) + { + push_back_name = "push_back_ref"; + } else { + push_back_name = "push_back"; + } + + register_function(system, &SequenceType::push_back, push_back_name); + register_function(system, &SequenceType::pop_back, "pop_back"); } template @@ -217,7 +264,7 @@ namespace dispatchkit register_function(system, &MapType::operator[], "[]"); bootstrap_unique_sorted_associative_container(system, type); bootstrap_pair_associative_container(system, type); - } + } template void bootstrap_string(Dispatch_Engine &system, const std::string &type) diff --git a/dispatchkit/boxed_value.hpp b/dispatchkit/boxed_value.hpp index e6255807..c64c2466 100644 --- a/dispatchkit/boxed_value.hpp +++ b/dispatchkit/boxed_value.hpp @@ -357,6 +357,18 @@ namespace dispatchkit } }; + template<> + struct Cast_Helper + { + typedef Boxed_Value Result_Type; + + static Result_Type cast(const Boxed_Value &ob) + { + return ob; + } + }; + + class bad_boxed_cast : public std::bad_cast { public: