summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--development/boost/README8
-rw-r--r--development/boost/boost-1_34_1-function-bugfix.diff704
-rw-r--r--development/boost/boost.SlackBuild132
-rw-r--r--development/boost/boost.info8
-rw-r--r--development/boost/slack-desc19
5 files changed, 871 insertions, 0 deletions
diff --git a/development/boost/README b/development/boost/README
new file mode 100644
index 0000000000..34d6af4c6d
--- /dev/null
+++ b/development/boost/README
@@ -0,0 +1,8 @@
+Boost provides free peer-reviewed portable C++ source libraries.
+The emphasis is on libraries that work well with the C++ Standard
+Library. One goal is to establish "existing practice" and provide
+reference implementations so that the Boost libraries are suitable
+for eventual standardization.
+
+If you do not want to build with icu4c support, than you'll need
+to pass ICU="NO" to the build-script.
diff --git a/development/boost/boost-1_34_1-function-bugfix.diff b/development/boost/boost-1_34_1-function-bugfix.diff
new file mode 100644
index 0000000000..200e6c79fc
--- /dev/null
+++ b/development/boost/boost-1_34_1-function-bugfix.diff
@@ -0,0 +1,704 @@
+diff -U 3 -H -d -r -N -- boost_1_34_1/boost/function/function_base.hpp boost_1_34_1-patched/boost/function/function_base.hpp
+--- boost_1_34_1/boost/function/function_base.hpp 2006-10-13 16:29:45.000000000 +0200
++++ boost_1_34_1-patched/boost/function/function_base.hpp 2007-12-22 10:21:10.000000000 +0100
+@@ -15,6 +15,7 @@
+ #include <memory>
+ #include <new>
+ #include <typeinfo>
++#include <functional> // unary_function, binary_function
+ #include <boost/config.hpp>
+ #include <boost/assert.hpp>
+ #include <boost/type_traits/is_integral.hpp>
+@@ -30,6 +31,20 @@
+ #endif
+ #include <boost/function_equal.hpp>
+
++#if defined(BOOST_MSVC)
++# pragma warning( push )
++# pragma warning( disable : 4793 ) // complaint about native code generation
++# pragma warning( disable : 4127 ) // "conditional expression is constant"
++#endif
++
++// Define BOOST_FUNCTION_STD_NS to the namespace that contains type_info.
++#ifdef BOOST_NO_EXCEPTION_STD_NAMESPACE
++// Embedded VC++ does not have type_info in namespace std
++# define BOOST_FUNCTION_STD_NS
++#else
++# define BOOST_FUNCTION_STD_NS std
++#endif
++
+ // Borrowed from Boost.Python library: determines the cases where we
+ // need to use std::type_info::name to compare instead of operator==.
+ # if (defined(__GNUC__) && __GNUC__ >= 3) \
+@@ -59,7 +74,7 @@
+
+ #if defined (BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+ || defined(BOOST_BCB_PARTIAL_SPECIALIZATION_BUG) \
+- || !(BOOST_STRICT_CONFIG || !defined(__SUNPRO_CC) || __SUNPRO_CC > 0x540)
++ || !(defined(BOOST_STRICT_CONFIG) || !defined(__SUNPRO_CC) || __SUNPRO_CC > 0x540)
+ # define BOOST_FUNCTION_NO_FUNCTION_TYPE_SYNTAX
+ #endif
+
+@@ -198,8 +213,8 @@
+ struct reference_manager
+ {
+ static inline void
+- get(const function_buffer& in_buffer, function_buffer& out_buffer,
+- functor_manager_operation_type op)
++ manage(const function_buffer& in_buffer, function_buffer& out_buffer,
++ functor_manager_operation_type op)
+ {
+ switch (op) {
+ case clone_functor_tag:
+@@ -215,8 +230,8 @@
+ // DPG TBD: Since we're only storing a pointer, it's
+ // possible that the user could ask for a base class or
+ // derived class. Is that okay?
+- const std::type_info& check_type =
+- *static_cast<const std::type_info*>(out_buffer.const_obj_ptr);
++ const BOOST_FUNCTION_STD_NS::type_info& check_type =
++ *static_cast<const BOOST_FUNCTION_STD_NS::type_info*>(out_buffer.const_obj_ptr);
+ if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, typeid(F)))
+ out_buffer.obj_ptr = in_buffer.obj_ptr;
+ else
+@@ -265,8 +280,8 @@
+ else if (op == destroy_functor_tag)
+ out_buffer.func_ptr = 0;
+ else /* op == check_functor_type_tag */ {
+- const std::type_info& check_type =
+- *static_cast<const std::type_info*>(out_buffer.const_obj_ptr);
++ const BOOST_FUNCTION_STD_NS::type_info& check_type =
++ *static_cast<const BOOST_FUNCTION_STD_NS::type_info*>(out_buffer.const_obj_ptr);
+ if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, typeid(Functor)))
+ out_buffer.obj_ptr = &in_buffer.func_ptr;
+ else
+@@ -287,8 +302,8 @@
+ // Some compilers (Borland, vc6, ...) are unhappy with ~functor_type.
+ reinterpret_cast<functor_type*>(&out_buffer.data)->~Functor();
+ } else /* op == check_functor_type_tag */ {
+- const std::type_info& check_type =
+- *static_cast<const std::type_info*>(out_buffer.const_obj_ptr);
++ const BOOST_FUNCTION_STD_NS::type_info& check_type =
++ *static_cast<const BOOST_FUNCTION_STD_NS::type_info*>(out_buffer.const_obj_ptr);
+ if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, typeid(Functor)))
+ out_buffer.obj_ptr = &in_buffer.data;
+ else
+@@ -348,8 +363,8 @@
+ # endif // BOOST_NO_STD_ALLOCATOR
+ out_buffer.obj_ptr = 0;
+ } else /* op == check_functor_type_tag */ {
+- const std::type_info& check_type =
+- *static_cast<const std::type_info*>(out_buffer.const_obj_ptr);
++ const BOOST_FUNCTION_STD_NS::type_info& check_type =
++ *static_cast<const BOOST_FUNCTION_STD_NS::type_info*>(out_buffer.const_obj_ptr);
+ if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, typeid(Functor)))
+ out_buffer.obj_ptr = in_buffer.obj_ptr;
+ else
+@@ -368,6 +383,15 @@
+ mpl::bool_<(function_allows_small_object_optimization<functor_type>::value)>());
+ }
+
++ // For member pointers, we treat them as function objects with
++ // the small-object optimization always enabled.
++ static inline void
++ manager(const function_buffer& in_buffer, function_buffer& out_buffer,
++ functor_manager_operation_type op, member_ptr_tag)
++ {
++ manager(in_buffer, out_buffer, op, mpl::true_());
++ }
++
+ public:
+ /* Dispatch to an appropriate manager based on whether we have a
+ function pointer or a function object pointer. */
+@@ -456,7 +480,6 @@
+ */
+ struct vtable_base
+ {
+- vtable_base() : manager(0) { }
+ void (*manager)(const function_buffer& in_buffer,
+ function_buffer& out_buffer,
+ functor_manager_operation_type op);
+@@ -480,13 +503,13 @@
+
+ /** Retrieve the type of the stored function object, or typeid(void)
+ if this is empty. */
+- const std::type_info& target_type() const
++ const BOOST_FUNCTION_STD_NS::type_info& target_type() const
+ {
+ if (!vtable) return typeid(void);
+
+ detail::function::function_buffer type;
+ vtable->manager(functor, type, detail::function::get_functor_type_tag);
+- return *static_cast<const std::type_info*>(type.const_obj_ptr);
++ return *static_cast<const BOOST_FUNCTION_STD_NS::type_info*>(type.const_obj_ptr);
+ }
+
+ template<typename Functor>
+@@ -558,7 +581,7 @@
+ #endif
+
+ public: // should be protected, but GCC 2.95.3 will fail to allow access
+- detail::function::vtable_base* vtable;
++ const detail::function::vtable_base* vtable;
+ mutable detail::function::function_buffer functor;
+ };
+
+@@ -733,4 +756,8 @@
+ #undef BOOST_FUNCTION_ENABLE_IF_NOT_INTEGRAL
+ #undef BOOST_FUNCTION_COMPARE_TYPE_ID
+
++#if defined(BOOST_MSVC)
++# pragma warning( pop )
++#endif
++
+ #endif // BOOST_FUNCTION_BASE_HEADER
+diff -U 3 -H -d -r -N -- boost_1_34_1/boost/function/function_template.hpp boost_1_34_1-patched/boost/function/function_template.hpp
+--- boost_1_34_1/boost/function/function_template.hpp 2006-09-29 19:23:28.000000000 +0200
++++ boost_1_34_1-patched/boost/function/function_template.hpp 2007-12-21 10:03:05.000000000 +0100
+@@ -11,6 +11,11 @@
+ // protection.
+ #include <boost/function/detail/prologue.hpp>
+
++#if defined(BOOST_MSVC)
++# pragma warning( push )
++# pragma warning( disable : 4127 ) // "conditional expression is constant"
++#endif
++
+ #define BOOST_FUNCTION_TEMPLATE_PARMS BOOST_PP_ENUM_PARAMS(BOOST_FUNCTION_NUM_ARGS, typename T)
+
+ #define BOOST_FUNCTION_TEMPLATE_ARGS BOOST_PP_ENUM_PARAMS(BOOST_FUNCTION_NUM_ARGS, T)
+@@ -54,12 +59,20 @@
+ BOOST_JOIN(function_ref_invoker,BOOST_FUNCTION_NUM_ARGS)
+ #define BOOST_FUNCTION_VOID_FUNCTION_REF_INVOKER \
+ BOOST_JOIN(void_function_ref_invoker,BOOST_FUNCTION_NUM_ARGS)
++#define BOOST_FUNCTION_MEMBER_INVOKER \
++ BOOST_JOIN(member_invoker,BOOST_FUNCTION_NUM_ARGS)
++#define BOOST_FUNCTION_VOID_MEMBER_INVOKER \
++ BOOST_JOIN(void_member_invoker,BOOST_FUNCTION_NUM_ARGS)
+ #define BOOST_FUNCTION_GET_FUNCTION_INVOKER \
+ BOOST_JOIN(get_function_invoker,BOOST_FUNCTION_NUM_ARGS)
+ #define BOOST_FUNCTION_GET_FUNCTION_OBJ_INVOKER \
+ BOOST_JOIN(get_function_obj_invoker,BOOST_FUNCTION_NUM_ARGS)
+ #define BOOST_FUNCTION_GET_FUNCTION_REF_INVOKER \
+ BOOST_JOIN(get_function_ref_invoker,BOOST_FUNCTION_NUM_ARGS)
++#define BOOST_FUNCTION_GET_MEMBER_INVOKER \
++ BOOST_JOIN(get_member_invoker,BOOST_FUNCTION_NUM_ARGS)
++#define BOOST_FUNCTION_GET_INVOKER \
++ BOOST_JOIN(get_invoker,BOOST_FUNCTION_NUM_ARGS)
+ #define BOOST_FUNCTION_VTABLE BOOST_JOIN(basic_vtable,BOOST_FUNCTION_NUM_ARGS)
+
+ #ifndef BOOST_NO_VOID_RETURNS
+@@ -70,16 +83,6 @@
+ # define BOOST_FUNCTION_RETURN(X) X; return BOOST_FUNCTION_VOID_RETURN_TYPE ()
+ #endif
+
+-#ifdef BOOST_MSVC
+-# pragma warning(push)
+-# pragma warning(disable: 4127) // conditional expression is constant.
+-#endif
+-
+-#ifdef BOOST_MSVC
+-# pragma warning(push)
+-# pragma warning(disable: 4127) // conditional expression is constant.
+-#endif
+-
+ namespace boost {
+ namespace detail {
+ namespace function {
+@@ -191,6 +194,44 @@
+ }
+ };
+
++#if BOOST_FUNCTION_NUM_ARGS > 0
++ /* Handle invocation of member pointers. */
++ template<
++ typename MemberPtr,
++ typename R BOOST_FUNCTION_COMMA
++ BOOST_FUNCTION_TEMPLATE_PARMS
++ >
++ struct BOOST_FUNCTION_MEMBER_INVOKER
++ {
++ static R invoke(function_buffer& function_obj_ptr BOOST_FUNCTION_COMMA
++ BOOST_FUNCTION_PARMS)
++
++ {
++ MemberPtr* f =
++ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
++ return boost::mem_fn(*f)(BOOST_FUNCTION_ARGS);
++ }
++ };
++
++ template<
++ typename MemberPtr,
++ typename R BOOST_FUNCTION_COMMA
++ BOOST_FUNCTION_TEMPLATE_PARMS
++ >
++ struct BOOST_FUNCTION_VOID_MEMBER_INVOKER
++ {
++ static BOOST_FUNCTION_VOID_RETURN_TYPE
++ invoke(function_buffer& function_obj_ptr BOOST_FUNCTION_COMMA
++ BOOST_FUNCTION_PARMS)
++
++ {
++ MemberPtr* f =
++ reinterpret_cast<MemberPtr*>(&function_obj_ptr.data);
++ BOOST_FUNCTION_RETURN(boost::mem_fn(*f)(BOOST_FUNCTION_ARGS));
++ }
++ };
++#endif
++
+ template<
+ typename FunctionPtr,
+ typename R BOOST_FUNCTION_COMMA
+@@ -254,12 +295,130 @@
+ >::type type;
+ };
+
++#if BOOST_FUNCTION_NUM_ARGS > 0
++ /* Retrieve the appropriate invoker for a member pointer. */
++ template<
++ typename MemberPtr,
++ typename R BOOST_FUNCTION_COMMA
++ BOOST_FUNCTION_TEMPLATE_PARMS
++ >
++ struct BOOST_FUNCTION_GET_MEMBER_INVOKER
++ {
++ typedef typename mpl::if_c<(is_void<R>::value),
++ BOOST_FUNCTION_VOID_MEMBER_INVOKER<
++ MemberPtr,
++ R BOOST_FUNCTION_COMMA
++ BOOST_FUNCTION_TEMPLATE_ARGS
++ >,
++ BOOST_FUNCTION_MEMBER_INVOKER<
++ MemberPtr,
++ R BOOST_FUNCTION_COMMA
++ BOOST_FUNCTION_TEMPLATE_ARGS
++ >
++ >::type type;
++ };
++#endif
++
++ /* Given the tag returned by get_function_tag, retrieve the
++ actual invoker that will be used for the given function
++ object.
++
++ Each specialization contains an "apply" nested class template
++ that accepts the function object, return type, function
++ argument types, and allocator. The resulting "apply" class
++ contains two typedefs, "invoker_type" and "manager_type",
++ which correspond to the invoker and manager types. */
++ template<typename Tag>
++ struct BOOST_FUNCTION_GET_INVOKER { };
++
++ /* Retrieve the invoker for a function pointer. */
++ template<>
++ struct BOOST_FUNCTION_GET_INVOKER<function_ptr_tag>
++ {
++ template<typename FunctionPtr,
++ typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS,
++ typename Allocator>
++ struct apply
++ {
++ typedef typename BOOST_FUNCTION_GET_FUNCTION_INVOKER<
++ FunctionPtr,
++ R BOOST_FUNCTION_COMMA
++ BOOST_FUNCTION_TEMPLATE_ARGS
++ >::type
++ invoker_type;
++
++ typedef functor_manager<FunctionPtr, Allocator> manager_type;
++ };
++ };
++
++#if BOOST_FUNCTION_NUM_ARGS > 0
++ /* Retrieve the invoker for a member pointer. */
++ template<>
++ struct BOOST_FUNCTION_GET_INVOKER<member_ptr_tag>
++ {
++ template<typename MemberPtr,
++ typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS,
++ typename Allocator>
++ struct apply
++ {
++ typedef typename BOOST_FUNCTION_GET_MEMBER_INVOKER<
++ MemberPtr,
++ R BOOST_FUNCTION_COMMA
++ BOOST_FUNCTION_TEMPLATE_ARGS
++ >::type
++ invoker_type;
++
++ typedef functor_manager<MemberPtr, Allocator> manager_type;
++ };
++ };
++#endif
++
++ /* Retrieve the invoker for a function object. */
++ template<>
++ struct BOOST_FUNCTION_GET_INVOKER<function_obj_tag>
++ {
++ template<typename FunctionObj,
++ typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS,
++ typename Allocator>
++ struct apply
++ {
++ typedef typename BOOST_FUNCTION_GET_FUNCTION_OBJ_INVOKER<
++ FunctionObj,
++ R BOOST_FUNCTION_COMMA
++ BOOST_FUNCTION_TEMPLATE_ARGS
++ >::type
++ invoker_type;
++
++ typedef functor_manager<FunctionObj, Allocator> manager_type;
++ };
++ };
++
++ /* Retrieve the invoker for a reference to a function object. */
++ template<>
++ struct BOOST_FUNCTION_GET_INVOKER<function_obj_ref_tag>
++ {
++ template<typename RefWrapper,
++ typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS,
++ typename Allocator>
++ struct apply
++ {
++ typedef typename BOOST_FUNCTION_GET_FUNCTION_REF_INVOKER<
++ typename RefWrapper::type,
++ R BOOST_FUNCTION_COMMA
++ BOOST_FUNCTION_TEMPLATE_ARGS
++ >::type
++ invoker_type;
++
++ typedef reference_manager<typename RefWrapper::type> manager_type;
++ };
++ };
++
+ /**
+ * vtable for a specific boost::function instance.
+ */
+ template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS,
+ typename Allocator>
+- struct BOOST_FUNCTION_VTABLE : vtable_base
++ struct BOOST_FUNCTION_VTABLE
+ {
+ #ifndef BOOST_NO_VOID_RETURNS
+ typedef R result_type;
+@@ -272,50 +431,25 @@
+ BOOST_FUNCTION_TEMPLATE_ARGS);
+
+ template<typename F>
+- BOOST_FUNCTION_VTABLE(F f) : vtable_base(), invoker(0)
+- {
+- init(f);
+- }
+-
+- template<typename F>
+- bool assign_to(F f, function_buffer& functor)
++ bool assign_to(const F& f, function_buffer& functor) const
+ {
+ typedef typename get_function_tag<F>::type tag;
+ return assign_to(f, functor, tag());
+ }
+
+- void clear(function_buffer& functor)
++ void clear(function_buffer& functor) const
+ {
+- if (manager)
+- manager(functor, functor, destroy_functor_tag);
++ if (base.manager)
++ base.manager(functor, functor, destroy_functor_tag);
+ }
+-
++#ifndef BOOST_NO_PRIVATE_IN_AGGREGATE
+ private:
+- template<typename F>
+- void init(F f)
+- {
+- typedef typename get_function_tag<F>::type tag;
+- init(f, tag());
+- }
+-
++#endif
+ // Function pointers
+ template<typename FunctionPtr>
+- void init(FunctionPtr /*f*/, function_ptr_tag)
+- {
+- typedef typename BOOST_FUNCTION_GET_FUNCTION_INVOKER<
+- FunctionPtr,
+- R BOOST_FUNCTION_COMMA
+- BOOST_FUNCTION_TEMPLATE_ARGS
+- >::type
+- actual_invoker_type;
+-
+- invoker = &actual_invoker_type::invoke;
+- manager = &functor_manager<FunctionPtr, Allocator>::manage;
+- }
+-
+- template<typename FunctionPtr>
+ bool
+- assign_to(FunctionPtr f, function_buffer& functor, function_ptr_tag)
++ assign_to(FunctionPtr f, function_buffer& functor,
++ function_ptr_tag) const
+ {
+ this->clear(functor);
+ if (f) {
+@@ -331,22 +465,13 @@
+ // Member pointers
+ #if BOOST_FUNCTION_NUM_ARGS > 0
+ template<typename MemberPtr>
+- void init(MemberPtr f, member_ptr_tag)
+- {
+- // DPG TBD: Add explicit support for member function
+- // objects, so we invoke through mem_fn() but we retain the
+- // right target_type() values.
+- this->init(mem_fn(f));
+- }
+-
+- template<typename MemberPtr>
+- bool assign_to(MemberPtr f, function_buffer& functor, member_ptr_tag)
++ bool
++ assign_to(MemberPtr f, function_buffer& functor, member_ptr_tag) const
+ {
+- // DPG TBD: Add explicit support for member function
+- // objects, so we invoke through mem_fn() but we retain the
+- // right target_type() values.
+ if (f) {
+- this->assign_to(mem_fn(f), functor);
++ // Always use the small-object optimization for member
++ // pointers.
++ assign_functor(f, functor, mpl::true_());
+ return true;
+ } else {
+ return false;
+@@ -355,24 +480,11 @@
+ #endif // BOOST_FUNCTION_NUM_ARGS > 0
+
+ // Function objects
+- template<typename FunctionObj>
+- void init(FunctionObj /*f*/, function_obj_tag)
+- {
+- typedef typename BOOST_FUNCTION_GET_FUNCTION_OBJ_INVOKER<
+- FunctionObj,
+- R BOOST_FUNCTION_COMMA
+- BOOST_FUNCTION_TEMPLATE_ARGS
+- >::type
+- actual_invoker_type;
+-
+- invoker = &actual_invoker_type::invoke;
+- manager = &functor_manager<FunctionObj, Allocator>::manage;
+- }
+-
+ // Assign to a function object using the small object optimization
+ template<typename FunctionObj>
+ void
+- assign_functor(FunctionObj f, function_buffer& functor, mpl::true_)
++ assign_functor(const FunctionObj& f, function_buffer& functor,
++ mpl::true_) const
+ {
+ new ((void*)&functor.data) FunctionObj(f);
+ }
+@@ -380,7 +492,8 @@
+ // Assign to a function object allocated on the heap.
+ template<typename FunctionObj>
+ void
+- assign_functor(FunctionObj f, function_buffer& functor, mpl::false_)
++ assign_functor(const FunctionObj& f, function_buffer& functor,
++ mpl::false_) const
+ {
+ #ifndef BOOST_NO_STD_ALLOCATOR
+ typedef typename Allocator::template rebind<FunctionObj>::other
+@@ -400,7 +513,8 @@
+
+ template<typename FunctionObj>
+ bool
+- assign_to(FunctionObj f, function_buffer& functor, function_obj_tag)
++ assign_to(const FunctionObj& f, function_buffer& functor,
++ function_obj_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
+ assign_functor(f, functor,
+@@ -413,24 +527,9 @@
+
+ // Reference to a function object
+ template<typename FunctionObj>
+- void
+- init(const reference_wrapper<FunctionObj>& /*f*/, function_obj_ref_tag)
+- {
+- typedef typename BOOST_FUNCTION_GET_FUNCTION_REF_INVOKER<
+- FunctionObj,
+- R BOOST_FUNCTION_COMMA
+- BOOST_FUNCTION_TEMPLATE_ARGS
+- >::type
+- actual_invoker_type;
+-
+- invoker = &actual_invoker_type::invoke;
+- manager = &reference_manager<FunctionObj>::get;
+- }
+-
+- template<typename FunctionObj>
+ bool
+ assign_to(const reference_wrapper<FunctionObj>& f,
+- function_buffer& functor, function_obj_ref_tag)
++ function_buffer& functor, function_obj_ref_tag) const
+ {
+ if (!boost::detail::function::has_empty_target(f.get_pointer())) {
+ // DPG TBD: We might need to detect constness of
+@@ -445,6 +544,7 @@
+ }
+
+ public:
++ vtable_base base;
+ invoker_type invoker;
+ };
+ } // end namespace function
+@@ -456,6 +556,17 @@
+ typename Allocator = BOOST_FUNCTION_DEFAULT_ALLOCATOR
+ >
+ class BOOST_FUNCTION_FUNCTION : public function_base
++
++#if BOOST_FUNCTION_NUM_ARGS == 1
++
++ , public std::unary_function<T0,R>
++
++#elif BOOST_FUNCTION_NUM_ARGS == 2
++
++ , public std::binary_function<T0,T1,R>
++
++#endif
++
+ {
+ public:
+ #ifndef BOOST_NO_VOID_RETURNS
+@@ -537,7 +648,7 @@
+ if (this->empty())
+ boost::throw_exception(bad_function_call());
+
+- return static_cast<vtable_type*>(vtable)->invoker
++ return reinterpret_cast<const vtable_type*>(vtable)->invoker
+ (this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS);
+ }
+ #else
+@@ -561,12 +672,16 @@
+ operator=(Functor BOOST_FUNCTION_TARGET_FIX(const &) f)
+ {
+ this->clear();
++#ifndef BOOST_NO_EXCEPTIONS
+ try {
+ this->assign_to(f);
+ } catch (...) {
+ vtable = 0;
+ throw;
+ }
++#else
++ this->assign_to(f);
++#endif
+ return *this;
+ }
+
+@@ -592,12 +707,16 @@
+ return *this;
+
+ this->clear();
++#ifndef BOOST_NO_EXCEPTIONS
+ try {
+ this->assign_to_own(f);
+ } catch (...) {
+ vtable = 0;
+ throw;
+ }
++#else
++ this->assign_to_own(f);
++#endif
+ return *this;
+ }
+
+@@ -615,7 +734,7 @@
+ void clear()
+ {
+ if (vtable) {
+- static_cast<vtable_type*>(vtable)->clear(this->functor);
++ reinterpret_cast<const vtable_type*>(vtable)->clear(this->functor);
+ vtable = 0;
+ }
+ }
+@@ -650,10 +769,24 @@
+ }
+
+ template<typename Functor>
+- void assign_to(Functor f)
++ void assign_to(const Functor& f)
+ {
+- static vtable_type stored_vtable(f);
+- if (stored_vtable.assign_to(f, functor)) vtable = &stored_vtable;
++ using detail::function::vtable_base;
++
++ typedef typename detail::function::get_function_tag<Functor>::type tag;
++ typedef detail::function::BOOST_FUNCTION_GET_INVOKER<tag> get_invoker;
++ typedef typename get_invoker::
++ template apply<Functor, R BOOST_FUNCTION_COMMA
++ BOOST_FUNCTION_TEMPLATE_ARGS, Allocator>
++ handler_type;
++
++ typedef typename handler_type::invoker_type invoker_type;
++ typedef typename handler_type::manager_type manager_type;
++
++ static const vtable_type stored_vtable =
++ { { &manager_type::manage }, &invoker_type::invoke };
++
++ if (stored_vtable.assign_to(f, functor)) vtable = &stored_vtable.base;
+ else vtable = 0;
+ }
+ };
+@@ -688,7 +821,7 @@
+ if (this->empty())
+ boost::throw_exception(bad_function_call());
+
+- return static_cast<vtable_type*>(vtable)->invoker
++ return reinterpret_cast<const vtable_type*>(vtable)->invoker
+ (this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS);
+ }
+ #endif
+@@ -798,21 +931,14 @@
+ }
+ };
+
+-#ifdef BOOST_MSVC
+-# pragma warning(pop)
+-#endif
+-
+ #undef BOOST_FUNCTION_PARTIAL_SPEC
+ #endif // have partial specialization
+
+ } // end namespace boost
+
+-#ifdef BOOST_MSVC
+-# pragma warning(pop)
+-#endif
+-
+ // Cleanup after ourselves...
+ #undef BOOST_FUNCTION_VTABLE
++#undef BOOST_FUNCTION_GET_INVOKER
+ #undef BOOST_FUNCTION_DEFAULT_ALLOCATOR
+ #undef BOOST_FUNCTION_COMMA
+ #undef BOOST_FUNCTION_FUNCTION
+@@ -822,10 +948,12 @@
+ #undef BOOST_FUNCTION_VOID_FUNCTION_OBJ_INVOKER
+ #undef BOOST_FUNCTION_FUNCTION_REF_INVOKER
+ #undef BOOST_FUNCTION_VOID_FUNCTION_REF_INVOKER
++#undef BOOST_FUNCTION_MEMBER_INVOKER
++#undef BOOST_FUNCTION_VOID_MEMBER_INVOKER
+ #undef BOOST_FUNCTION_GET_FUNCTION_INVOKER
+ #undef BOOST_FUNCTION_GET_FUNCTION_OBJ_INVOKER
+ #undef BOOST_FUNCTION_GET_FUNCTION_REF_INVOKER
+-#undef BOOST_FUNCTION_GET_MEM_FUNCTION_INVOKER
++#undef BOOST_FUNCTION_GET_MEMBER_INVOKER
+ #undef BOOST_FUNCTION_TEMPLATE_PARMS
+ #undef BOOST_FUNCTION_TEMPLATE_ARGS
+ #undef BOOST_FUNCTION_PARMS
+@@ -835,3 +963,7 @@
+ #undef BOOST_FUNCTION_ARG_TYPES
+ #undef BOOST_FUNCTION_VOID_RETURN_TYPE
+ #undef BOOST_FUNCTION_RETURN
++
++#if defined(BOOST_MSVC)
++# pragma warning( pop )
++#endif
diff --git a/development/boost/boost.SlackBuild b/development/boost/boost.SlackBuild
new file mode 100644
index 0000000000..0bfd537a99
--- /dev/null
+++ b/development/boost/boost.SlackBuild
@@ -0,0 +1,132 @@
+#!/bin/sh
+
+# Slackware build script for boost
+
+# Copyright 2007-2008 Eric Hameleers <alien@slackware.com>
+# Copyright 2007 Heinz Wiesinger
+# All rights reserved.
+#
+# Redistribution and use of this script, with or without modification, is
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of this script must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# bjam-build system mostly taken from SlackBuild by Eric Hameleers
+
+# Script modified by Robby Workman <rworkman@slackbuilds.org>
+# -- no additional license terms and no copyright
+
+PRGNAM=boost
+VERSION=1_34_1
+ARCH=${ARCH:-i486}
+BUILD=${BUILD:-3}
+TAG=${TAG:-_SBo}
+CWD=$(pwd)
+TMP=${TMP:-/tmp/SBo}
+PKG=$TMP/package-$PRGNAM
+OUTPUT=${OUTPUT:-/tmp}
+
+ICU=${ICU:-YES}
+PKG_VERSION=$(echo $VERSION | tr '_' '.') # Leave this alone
+
+if [ "$ARCH" = "i486" ]; then
+ SLKCFLAGS="-O2 -march=i486 -mtune=i686"
+elif [ "$ARCH" = "i686" ]; then
+ SLKCFLAGS="-O2 -march=i686 -mtune=i686"
+fi
+
+set -e
+
+rm -rf $PKG
+mkdir -p $TMP $PKG $OUTPUT
+cd $TMP
+rm -rf ${PRGNAM}_$VERSION
+tar xvf $CWD/${PRGNAM}_$VERSION.tar.bz2
+cd ${PRGNAM}_$VERSION
+chown -R root:root .
+find . \
+ \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \
+ -exec chmod 755 {} \; -o \
+ \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
+ -exec chmod 644 {} \;
+
+if [ "$ICU" = "YES" ]; then
+ do_icu="-sICU_PATH=/usr"
+else
+ do_icu=""
+fi
+
+# This is the python we build against:
+PYTHON_VERSION=$(python -c 'import sys; print sys.version[:3]')
+PYTHON_FLAGS="-sPYTHON_ROOT=/usr -sPYTHON_VERSION=$PYTHON_VERSION"
+
+# This fixes a critical bug that affects the construction of Boost.Function
+# objects in a multi-threaded context.
+patch -p1 < $CWD/boost-1_34_1-function-bugfix.diff
+
+# First build bjam, the boost build system:
+cd tools/jam/src
+ CFLAGS="$SLKCFLAGS -fno-strict-aliasing" CC=gcc ./build.sh cc
+cd -
+
+BJAM=$(find tools/jam/src/ -name bjam -a -type f)
+
+# Create build subdirectory
+mkdir obj
+
+# Next, we build boost using bjam
+$BJAM \
+ release \
+ "-sBUILD=<optimization>speed <inlining>full <threading>single/multi" \
+ "-sNO_COMPRESSION=0" \
+ "-sZLIB_INCLUDE=/usr/include" \
+ "-sZLIB_LIBPATH=/usr/lib" \
+ "-sBZIP2_INCLUDE=/usr/include" \
+ "-sBZIP2_LIBPATH=/usr/lib" \
+ --toolset=gcc \
+ --layout=system \
+ --builddir=obj \
+ --prefix=/usr \
+ $PYTHON_FLAGS \
+ $do_icu \
+ stage
+
+# And then install boost..
+mkdir -p $PKG/usr/{lib,include}
+
+$BJAM \
+ release \
+ --toolset=gcc \
+ --layout=system \
+ --builddir=obj \
+ --prefix=$PKG/usr \
+ $PYTHON_FLAGS \
+ $do_icu \
+ install
+
+( cd $PKG
+ find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
+ find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
+)
+
+mkdir -p $PKG/usr/doc/$PRGNAM-$PKG_VERSION
+cp -a LICENSE_1_0.txt README $PKG/usr/doc/$PRGNAM-$PKG_VERSION
+cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$PKG_VERSION/$PRGNAM.SlackBuild
+
+mkdir -p $PKG/install
+cat $CWD/slack-desc > $PKG/install/slack-desc
+
+cd $PKG
+/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$PKG_VERSION-$ARCH-$BUILD$TAG.tgz
diff --git a/development/boost/boost.info b/development/boost/boost.info
new file mode 100644
index 0000000000..1d739be417
--- /dev/null
+++ b/development/boost/boost.info
@@ -0,0 +1,8 @@
+PRGNAM="boost"
+VERSION="1.34.1"
+HOMEPAGE="http://www.boost.org/"
+DOWNLOAD="http://downloads.sourceforge.net/boost/boost_1_34_1.tar.bz2"
+MD5SUM="2d938467e8a448a2c9763e0a9f8ca7e5"
+MAINTAINER="ppr:kut"
+EMAIL="HMWiesinger@gmx.at"
+APPROVED="rworkman,alien"
diff --git a/development/boost/slack-desc b/development/boost/slack-desc
new file mode 100644
index 0000000000..dbc1a73a32
--- /dev/null
+++ b/development/boost/slack-desc
@@ -0,0 +1,19 @@
+# HOW TO EDIT THIS FILE:
+# The "handy ruler" below makes it easier to edit a package description. Line
+# up the first '|' above the ':' following the base package name, and the '|'
+# on the right side marks the last column you can put a character in. You must
+# make exactly 11 lines for the formatting to be correct. It's also
+# customary to leave one space after the ':'.
+
+ |-----handy-ruler------------------------------------------------------|
+boost: boost (Boost C++ Libraries)
+boost:
+boost: Boost provides free peer-reviewed portable C++ source libraries
+boost: The emphasis is on libraries that work well with the C++ Standard
+boost: Library. One goal is to establish "existing practice" and provide
+boost: reference implementations so that the Boost libraries are suitable
+boost: for eventual standardization.
+boost:
+boost: Homepage: http://www.boost.org/
+boost:
+boost: