@@ -43,6 +43,9 @@ namespace chaiscript
4343
4444 namespace dispatch
4545 {
46+ template <typename FunctionType>
47+ std::function<FunctionType> functor (std::shared_ptr<const Proxy_Function_Base> func, const Type_Conversions *t_conversions);
48+
4649 class Param_Types
4750 {
4851 public:
@@ -571,11 +574,73 @@ namespace chaiscript
571574 return detail::Do_Call<typename std::function<Func>::result_type>::go (m_f, params, t_conversions);
572575 }
573576
577+
574578 private:
575579 std::function<Func> m_f;
576580 Func *m_dummy_func;
577581 };
578582
583+ class Assignable_Proxy_Function : public Proxy_Function_Impl_Base
584+ {
585+ public:
586+ Assignable_Proxy_Function (const std::vector<Type_Info> &t_types)
587+ : Proxy_Function_Impl_Base(t_types)
588+ {
589+ }
590+
591+ virtual ~Assignable_Proxy_Function () {}
592+
593+
594+ virtual void assign (const std::shared_ptr<const Proxy_Function_Base> &t_rhs) = 0;
595+
596+
597+ };
598+
599+ template <typename Func>
600+ class Assignable_Proxy_Function_Impl : public Assignable_Proxy_Function
601+ {
602+ public:
603+ Assignable_Proxy_Function_Impl (std::reference_wrapper<std::function<Func>> t_f, std::shared_ptr<std::function<Func>> t_ptr)
604+ : Assignable_Proxy_Function(detail::build_param_type_list(static_cast <Func *>(nullptr ))),
605+ m_f (std::move(t_f)), m_shared_ptr_holder(std::move(t_ptr)), m_dummy_func(nullptr )
606+ {
607+ assert (!m_shared_ptr_holder || m_shared_ptr_holder.get () == &m_f.get ());
608+
609+ }
610+
611+ virtual ~Assignable_Proxy_Function_Impl () {}
612+
613+ virtual bool compare_types_with_cast (const std::vector<Boxed_Value> &vals, const Type_Conversions &t_conversions) const CHAISCRIPT_OVERRIDE
614+ {
615+ return detail::compare_types_cast (m_dummy_func, vals, t_conversions);
616+ }
617+
618+ virtual bool operator ==(const Proxy_Function_Base &t_func) const CHAISCRIPT_OVERRIDE
619+ {
620+ return dynamic_cast <const Assignable_Proxy_Function_Impl<Func> *>(&t_func) != nullptr ;
621+ }
622+
623+ std::function<Func> internal_function () const
624+ {
625+ return m_f.get ();
626+ }
627+
628+ virtual void assign (const std::shared_ptr<const Proxy_Function_Base> &t_rhs) {
629+ m_f.get () = dispatch::functor<Func>(t_rhs, nullptr );
630+ }
631+
632+ protected:
633+ virtual Boxed_Value do_call (const std::vector<Boxed_Value> ¶ms, const Type_Conversions &t_conversions) const
634+ {
635+ return detail::Do_Call<typename std::function<Func>::result_type>::go (m_f.get (), params, t_conversions);
636+ }
637+
638+
639+ private:
640+ std::reference_wrapper<std::function<Func>> m_f;
641+ std::shared_ptr<std::function<Func>> m_shared_ptr_holder;
642+ Func *m_dummy_func;
643+ };
579644 // / Attribute getter Proxy_Function implementation
580645 template <typename T, typename Class>
581646 class Attribute_Access : public Proxy_Function_Base
@@ -625,7 +690,7 @@ namespace chaiscript
625690 if (bv.is_const ())
626691 {
627692 const Class *o = boxed_cast<const Class *>(bv, &t_conversions);
628- return detail::Handle_Return<typename std::add_lvalue_reference<T>::type>::handle (o->*m_attr);
693+ return detail::Handle_Return<const typename std::add_lvalue_reference<T>::type>::handle (o->*m_attr);
629694 } else {
630695 Class *o = boxed_cast<Class *>(bv, &t_conversions);
631696 return detail::Handle_Return<typename std::add_lvalue_reference<T>::type>::handle (o->*m_attr);
0 commit comments