--- fixed_array.hpp	2007-12-09 21:41:30.281250000 +0100
+++ fixed_array.hpp.original	2007-12-04 23:43:27.093750000 +0100
@@ -156,17 +156,6 @@
 
 #endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
 
-namespace detail
-{
-    template< class Array >
-    inline void copy_swap( Array& l, Array& r )
-    {
-        Array temp(l, true); // assume dummy copying constructor
-        l.copy_(r);
-        r.copy_(temp);
-    }
-}
-
 /* /////////////////////////////////////////////////////////////////////////
  * Classes
  */
@@ -242,10 +231,8 @@
 #endif /* STLSOFT_CF_BIDIRECTIONAL_ITERATOR_SUPPORT */
 
 // Construction
-private:
-                  fixed_array_1d(class_type const& rhs, bool /*dummy*/);  
-public:
                   fixed_array_1d(T *data, index_type d0);
+public:
     ss_explicit_k fixed_array_1d(index_type d0);
                   fixed_array_1d(index_type d0, value_type const& t);
                   fixed_array_1d(class_type const& rhs);
@@ -300,13 +287,10 @@
 
 // Access
 public:
-    value_type              *data();
     value_type const        *data() const;
-    void                     swap(class_type& other);
 
 // Implementation
 private:
-    void        copy_(class_type const& r);
     pointer     allocate_(size_type n);
     void        deallocate_(pointer p, size_type n);
 
@@ -316,13 +300,11 @@
 
 // Members
 private:
-    T *           m_data;
-    index_type    m_d0;
+    T * const           m_data;
+    const index_type    m_d0;
 
     friend class fixed_array_2d<T, A, P, true>;
     friend class fixed_array_2d<T, A, P, false>;
-    template<class T>
-    friend void detail::copy_swap(T&,T&);
 
 // Not to be implemented
 private:
@@ -401,9 +383,8 @@
 
 // Construction
 private:
-    fixed_array_2d(class_type const& rhs, bool /*dummy*/); 
-public:
     fixed_array_2d(T *data, index_type d0, index_type d1);
+public:
     fixed_array_2d(index_type d0, index_type d1);
     fixed_array_2d(index_type d0, index_type d1, value_type const& t);
     fixed_array_2d(class_type const& rhs);
@@ -461,13 +442,10 @@
 
 // Access
 public:
-    value_type              *data();
     value_type const        *data() const;
-    void                     swap(class_type& other);
 
 // Implementation
 private:
-    void        copy_(class_type const& r);
     pointer     allocate_(size_type n);
     void        deallocate_(pointer p, size_type n);
 
@@ -478,15 +456,13 @@
 
 // Members
 private:
-    T *           m_data;
-    index_type    m_d0;
-    index_type    m_d1;
-    size_type     m_size;
+    T * const           m_data;
+    const index_type    m_d0;
+    const index_type    m_d1;
+    const size_type     m_size;
 
     friend class fixed_array_3d<T, A, P, true>;
     friend class fixed_array_3d<T, A, P, false>;
-    template< class T >
-    friend void detail::copy_swap(T&,T&);
 
 // Not to be implemented
 private:
@@ -825,13 +801,6 @@
 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
 
 // fixed_array_1d
-template <ss_typename_param_k T, ss_typename_param_k A, ss_typename_param_k P, ss_bool_t R>
-inline void fixed_array_1d<T, A, P, R>::copy_(fixed_array_1d const& r)
-{
-    static_cast<allocator_type&>(*this) = r;
-    m_data = r.m_data;
-    m_d0   = r.m_d0;
-}
 
 template <ss_typename_param_k T, ss_typename_param_k A, ss_typename_param_k P, ss_bool_t R>
 inline ss_typename_type_k fixed_array_1d<T, A, P, R>::pointer fixed_array_1d<T, A, P, R>::allocate_(ss_typename_type_k fixed_array_1d<T, A, P, R>::size_type n)
@@ -875,14 +844,6 @@
 }
 
 template <ss_typename_param_k T, ss_typename_param_k A, ss_typename_param_k P, ss_bool_t R>
-inline fixed_array_1d<T, A, P, R>::fixed_array_1d(fixed_array_1d<T, A, P, R> const& rhs, bool)
-    : m_data(rhs.m_data)
-    , m_d0(rhs.dimension0())
-{
-    STLSOFT_STATIC_ASSERT(R);
-}
-
-template <ss_typename_param_k T, ss_typename_param_k A, ss_typename_param_k P, ss_bool_t R>
 inline fixed_array_1d<T, A, P, R>::fixed_array_1d(T *src, ss_typename_type_k fixed_array_1d<T, A, P, R>::index_type d0)
     : m_data(src)
     , m_d0(d0)
@@ -1117,33 +1078,13 @@
 #endif /* STLSOFT_CF_BIDIRECTIONAL_ITERATOR_SUPPORT */
 
 template <ss_typename_param_k T, ss_typename_param_k A, ss_typename_param_k P, ss_bool_t R>
-inline ss_typename_type_k fixed_array_1d<T, A, P, R>::value_type * fixed_array_1d<T, A, P, R>::data()
-{
-    return m_data;
-}
-
-template <ss_typename_param_k T, ss_typename_param_k A, ss_typename_param_k P, ss_bool_t R>
 inline ss_typename_type_k fixed_array_1d<T, A, P, R>::value_type const* fixed_array_1d<T, A, P, R>::data() const
 {
     return m_data;
 }
 
-template <ss_typename_param_k T, ss_typename_param_k A, ss_typename_param_k P, ss_bool_t R>
-inline void fixed_array_1d<T, A, P, R>::swap( fixed_array_1d& r )
-{
-    detail::copy_swap(*this, r);
-}
 
 // fixed_array_2d
-template <ss_typename_param_k T, ss_typename_param_k A, ss_typename_param_k P, ss_bool_t R>
-inline void fixed_array_2d<T, A, P, R>::copy_(fixed_array_2d const& r)
-{
-    static_cast<allocator_type&>(*this) = r;
-    m_data = r.m_data;
-    m_d0   = r.m_d0;
-    m_d1   = r.m_d1;
-    m_size = r.m_size;
-}
 
 template <ss_typename_param_k T, ss_typename_param_k A, ss_typename_param_k P, ss_bool_t R>
 inline ss_typename_type_k fixed_array_2d<T, A, P, R>::pointer fixed_array_2d<T, A, P, R>::allocate_(ss_typename_type_k fixed_array_2d<T, A, P, R>::size_type n)
@@ -1199,15 +1140,6 @@
     STLSOFT_MESSAGE_ASSERT("fixed array index out of range", i0 < m_d0);
 #endif /* STLSOFT_CF_EXCEPTION_SUPPORT */
 }
-template <ss_typename_param_k T, ss_typename_param_k A, ss_typename_param_k P, ss_bool_t R>
-inline fixed_array_2d<T, A, P, R>::fixed_array_2d(fixed_array_2d<T, A, P, R> const& rhs, bool)
-    : m_data(rhs.m_data)
-    , m_d0(rhs.dimension0())
-    , m_d1(rhs.dimension1())
-    , m_size(rhs.m_size)
-{
-    STLSOFT_STATIC_ASSERT(R);
-}
 
 template <ss_typename_param_k T, ss_typename_param_k A, ss_typename_param_k P, ss_bool_t R>
 inline fixed_array_2d<T, A, P, R>::fixed_array_2d(T *src, ss_typename_type_k fixed_array_2d<T, A, P, R>::index_type d0, ss_typename_type_k fixed_array_2d<T, A, P, R>::index_type d1)
@@ -1484,23 +1416,11 @@
 #endif /* STLSOFT_CF_BIDIRECTIONAL_ITERATOR_SUPPORT */
 
 template <ss_typename_param_k T, ss_typename_param_k A, ss_typename_param_k P, ss_bool_t R>
-inline ss_typename_type_k fixed_array_2d<T, A, P, R>::value_type * fixed_array_2d<T, A, P, R>::data() 
-{
-    return m_data;
-}
-
-template <ss_typename_param_k T, ss_typename_param_k A, ss_typename_param_k P, ss_bool_t R>
 inline ss_typename_type_k fixed_array_2d<T, A, P, R>::value_type const* fixed_array_2d<T, A, P, R>::data() const
 {
     return m_data;
 }
 
-template <ss_typename_param_k T, ss_typename_param_k A, ss_typename_param_k P, ss_bool_t R>
-inline void fixed_array_2d<T, A, P, R>::swap(fixed_array_2d& other) 
-{
-    detail::copy_swap(*this, other);
-}
-
 // fixed_array_3d
 
 template <ss_typename_param_k T, ss_typename_param_k A, ss_typename_param_k P, ss_bool_t R>
