If no HAVE_STD_SHARED_PTR or HAVE_BOOST_SHARED_PTR then set ptr_lib to ndnboost in the boost headers in this distribution.
diff --git a/boost/smart_ptr/allocate_shared_array.hpp b/boost/smart_ptr/allocate_shared_array.hpp
new file mode 100644
index 0000000..48ad5d3
--- /dev/null
+++ b/boost/smart_ptr/allocate_shared_array.hpp
@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) 2012 Glen Joseph Fernandes
+ * glenfe at live dot com
+ *
+ * Distributed under the Boost Software License,
+ * Version 1.0. (See accompanying file LICENSE_1_0.txt
+ * or copy at http://boost.org/LICENSE_1_0.txt)
+ */
+#ifndef BOOST_SMART_PTR_ALLOCATE_SHARED_ARRAY_HPP
+#define BOOST_SMART_PTR_ALLOCATE_SHARED_ARRAY_HPP
+
+#include <boost/smart_ptr/shared_ptr.hpp>
+#include <boost/smart_ptr/detail/allocate_array_helper.hpp>
+#include <boost/smart_ptr/detail/array_deleter.hpp>
+#include <boost/smart_ptr/detail/array_traits.hpp>
+#include <boost/smart_ptr/detail/sp_if_array.hpp>
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+#include <initializer_list>
+#endif
+
+namespace ndnboost {
+    template<typename T, typename A>
+    inline typename ndnboost::detail::sp_if_array<T>::type
+    allocate_shared(const A& allocator, std::size_t size) {
+        typedef typename ndnboost::detail::array_inner<T>::type T1;
+        typedef typename ndnboost::detail::array_base<T1>::type T2;
+        T1* p1 = 0;
+        T2* p2 = 0;
+        std::size_t n1 = size * ndnboost::detail::array_total<T1>::size;
+        ndnboost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
+        ndnboost::detail::array_deleter<T2[]> d1(n1);
+        ndnboost::shared_ptr<T> s1(p1, d1, a1);
+        typedef ndnboost::detail::array_deleter<T2[]>* D2;
+        p1 = reinterpret_cast<T1*>(p2);
+        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
+        d2->init(p2);
+        return ndnboost::shared_ptr<T>(s1, p1);
+    }
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    template<typename T, typename A, typename... Args>
+    inline typename ndnboost::detail::sp_if_array<T>::type
+    allocate_shared(const A& allocator, std::size_t size, Args&&... args) {
+        typedef typename ndnboost::detail::array_inner<T>::type T1;
+        typedef typename ndnboost::detail::array_base<T1>::type T2;
+        T1* p1 = 0;
+        T2* p2 = 0;
+        std::size_t n1 = size * ndnboost::detail::array_total<T1>::size;
+        ndnboost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
+        ndnboost::detail::array_deleter<T2[]> d1(n1);
+        ndnboost::shared_ptr<T> s1(p1, d1, a1);
+        typedef ndnboost::detail::array_deleter<T2[]>* D2;
+        p1 = reinterpret_cast<T1*>(p2);
+        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
+        d2->init(p2, ndnboost::detail::sp_forward<Args>(args)...);
+        return ndnboost::shared_ptr<T>(s1, p1);
+    }
+    template<typename T, typename A, typename... Args>
+    inline typename ndnboost::detail::sp_if_size_array<T>::type
+    allocate_shared(const A& allocator, Args&&... args) {
+        typedef typename ndnboost::detail::array_inner<T>::type T1;
+        typedef typename ndnboost::detail::array_base<T1>::type T2;
+        enum {
+            N = ndnboost::detail::array_total<T>::size
+        };
+        T1* p1 = 0;
+        T2* p2 = 0;
+        ndnboost::detail::allocate_array_helper<A, T2[N]> a1(allocator, &p2);
+        ndnboost::detail::array_deleter<T2[N]> d1;
+        ndnboost::shared_ptr<T> s1(p1, d1, a1);
+        typedef ndnboost::detail::array_deleter<T2[N]>* D2;
+        p1 = reinterpret_cast<T1*>(p2);
+        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
+        d2->init(p2, ndnboost::detail::sp_forward<Args>(args)...);
+        return ndnboost::shared_ptr<T>(s1, p1);
+    }
+#endif
+#if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
+    template<typename T, typename A>
+    inline typename ndnboost::detail::sp_if_size_array<T>::type
+    allocate_shared(const A& allocator, const T& list) {
+        typedef typename ndnboost::detail::array_inner<T>::type T1;
+        typedef typename ndnboost::detail::array_base<T1>::type T2;
+        typedef const T2 T3;
+        enum {
+            N = ndnboost::detail::array_total<T>::size
+        };
+        T1* p1 = 0;
+        T2* p2 = 0;
+        T3* p3 = 0;
+        ndnboost::detail::allocate_array_helper<A, T2[N]> a1(allocator, &p2);
+        ndnboost::detail::array_deleter<T2[N]> d1;
+        ndnboost::shared_ptr<T> s1(p1, d1, a1);
+        typedef ndnboost::detail::array_deleter<T2[N]>* D2;
+        p3 = reinterpret_cast<T3*>(list);
+        p1 = reinterpret_cast<T1*>(p2);
+        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
+        d2->init_list(p2, p3);
+        return ndnboost::shared_ptr<T>(s1, p1);
+    }
+    template<typename T, typename A>
+    inline typename ndnboost::detail::sp_if_array<T>::type
+    allocate_shared(const A& allocator, std::size_t size,
+        const typename ndnboost::detail::array_inner<T>::type& list) {
+        typedef typename ndnboost::detail::array_inner<T>::type T1;
+        typedef typename ndnboost::detail::array_base<T1>::type T2;
+        typedef const T2 T3;
+        enum {
+            M = ndnboost::detail::array_total<T1>::size
+        };
+        T1* p1 = 0;
+        T2* p2 = 0;
+        T3* p3 = 0;
+        std::size_t n1 = M * size;
+        ndnboost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
+        ndnboost::detail::array_deleter<T2[]> d1(n1);
+        ndnboost::shared_ptr<T> s1(p1, d1, a1);
+        typedef ndnboost::detail::array_deleter<T2[]>* D2;
+        p3 = reinterpret_cast<T3*>(list);
+        p1 = reinterpret_cast<T1*>(p2);
+        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
+        d2->template init_list<M>(p2, p3);
+        return ndnboost::shared_ptr<T>(s1, p1);
+    }
+    template<typename T, typename A>
+    inline typename ndnboost::detail::sp_if_size_array<T>::type
+    allocate_shared(const A& allocator,
+        const typename ndnboost::detail::array_inner<T>::type& list) {
+        typedef typename ndnboost::detail::array_inner<T>::type T1;
+        typedef typename ndnboost::detail::array_base<T1>::type T2;
+        typedef const T2 T3;
+        enum {
+            M = ndnboost::detail::array_total<T1>::size,
+            N = ndnboost::detail::array_total<T>::size
+        };
+        T1* p1 = 0;
+        T2* p2 = 0;
+        T3* p3 = 0;
+        ndnboost::detail::allocate_array_helper<A, T2[N]> a1(allocator, &p2);
+        ndnboost::detail::array_deleter<T2[N]> d1;
+        ndnboost::shared_ptr<T> s1(p1, d1, a1);
+        typedef ndnboost::detail::array_deleter<T2[N]>* D2;
+        p3 = reinterpret_cast<T3*>(list);
+        p1 = reinterpret_cast<T1*>(p2);
+        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
+        d2->template init_list<M>(p2, p3);
+        return ndnboost::shared_ptr<T>(s1, p1);
+    }
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+    template<typename T, typename A>
+    inline typename ndnboost::detail::sp_if_array<T>::type
+    allocate_shared(const A& allocator,
+        std::initializer_list<typename ndnboost::detail::array_inner<T>::type> list) {
+        typedef typename ndnboost::detail::array_inner<T>::type T1;
+        typedef typename ndnboost::detail::array_base<T1>::type T2;
+        typedef const T2 T3;
+        T1* p1 = 0;
+        T2* p2 = 0;
+        T3* p3 = 0;
+        std::size_t n1 = list.size() * ndnboost::detail::array_total<T1>::size;
+        ndnboost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
+        ndnboost::detail::array_deleter<T2[]> d1(n1);
+        ndnboost::shared_ptr<T> s1(p1, d1, a1);
+        typedef ndnboost::detail::array_deleter<T2[]>* D2;
+        p3 = reinterpret_cast<T3*>(list.begin());
+        p1 = reinterpret_cast<T1*>(p2);
+        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
+        d2->init_list(p2, p3);
+        return ndnboost::shared_ptr<T>(s1, p1);
+    }
+#endif
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+    template<typename T, typename A>
+    inline typename ndnboost::detail::sp_if_array<T>::type
+    allocate_shared(const A& allocator, std::size_t size,
+        typename ndnboost::detail::array_base<T>::type&& value) {
+        typedef typename ndnboost::detail::array_inner<T>::type T1;
+        typedef typename ndnboost::detail::array_base<T1>::type T2;
+        T1* p1 = 0;
+        T2* p2 = 0;
+        std::size_t n1 = size * ndnboost::detail::array_total<T1>::size;
+        ndnboost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
+        ndnboost::detail::array_deleter<T2[]> d1(n1);
+        ndnboost::shared_ptr<T> s1(p1, d1, a1);
+        typedef ndnboost::detail::array_deleter<T2[]>* D2;
+        p1 = reinterpret_cast<T1*>(p2);
+        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
+        d2->init(p2, ndnboost::detail::sp_forward<T2>(value));
+        return ndnboost::shared_ptr<T>(s1, p1);
+    }
+    template<typename T, typename A>
+    inline typename ndnboost::detail::sp_if_size_array<T>::type
+    allocate_shared(const A& allocator,
+        typename ndnboost::detail::array_base<T>::type&& value) {
+        typedef typename ndnboost::detail::array_inner<T>::type T1;
+        typedef typename ndnboost::detail::array_base<T1>::type T2;
+        enum {
+            N = ndnboost::detail::array_total<T>::size
+        };
+        T1* p1 = 0;
+        T2* p2 = 0;
+        ndnboost::detail::allocate_array_helper<A, T2[N]> a1(allocator, &p2);
+        ndnboost::detail::array_deleter<T2[N]> d1;
+        ndnboost::shared_ptr<T> s1(p1, d1, a1);
+        typedef ndnboost::detail::array_deleter<T2[N]>* D2;
+        p1 = reinterpret_cast<T1*>(p2);
+        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
+        d2->init(p2, ndnboost::detail::sp_forward<T2>(value));
+        return ndnboost::shared_ptr<T>(s1, p1);
+    }
+#endif
+#endif
+    template<typename T, typename A>
+    inline typename ndnboost::detail::sp_if_array<T>::type
+    allocate_shared_noinit(const A& allocator, std::size_t size) {
+        typedef typename ndnboost::detail::array_inner<T>::type T1;
+        typedef typename ndnboost::detail::array_base<T1>::type T2;
+        T1* p1 = 0;
+        T2* p2 = 0;
+        std::size_t n1 = size * ndnboost::detail::array_total<T1>::size;
+        ndnboost::detail::allocate_array_helper<A, T2[]> a1(allocator, n1, &p2);
+        ndnboost::detail::array_deleter<T2[]> d1(n1);
+        ndnboost::shared_ptr<T> s1(p1, d1, a1);
+        typedef ndnboost::detail::array_deleter<T2[]>* D2;
+        p1 = reinterpret_cast<T1*>(p2);
+        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
+        d2->noinit(p2);
+        return ndnboost::shared_ptr<T>(s1, p1);
+    }
+    template<typename T, typename A>
+    inline typename ndnboost::detail::sp_if_size_array<T>::type
+    allocate_shared_noinit(const A& allocator) {
+        typedef typename ndnboost::detail::array_inner<T>::type T1;
+        typedef typename ndnboost::detail::array_base<T1>::type T2;
+        enum {
+            N = ndnboost::detail::array_total<T>::size
+        };
+        T1* p1 = 0;
+        T2* p2 = 0;
+        ndnboost::detail::allocate_array_helper<A, T2[N]> a1(allocator, &p2);
+        ndnboost::detail::array_deleter<T2[N]> d1;
+        ndnboost::shared_ptr<T> s1(p1, d1, a1);
+        typedef ndnboost::detail::array_deleter<T2[N]>* D2;
+        p1 = reinterpret_cast<T1*>(p2);
+        D2 d2 = static_cast<D2>(s1._internal_get_untyped_deleter());
+        d2->noinit(p2);
+        return ndnboost::shared_ptr<T>(s1, p1);
+    }
+}
+
+#endif