]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
Cleanup TableBase implementation from internal AlignedVectorSet/Move functions
authorkronbichler <kronbichler@0785d39b-7218-0410-832d-ea1e28bc413d>
Wed, 9 Apr 2014 08:42:47 +0000 (08:42 +0000)
committerkronbichler <kronbichler@0785d39b-7218-0410-832d-ea1e28bc413d>
Wed, 9 Apr 2014 08:42:47 +0000 (08:42 +0000)
git-svn-id: https://svn.dealii.org/trunk@32745 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/include/deal.II/base/aligned_vector.h
deal.II/include/deal.II/base/table.h

index c73f58f662fdec5cb1cf88f1b6e24d7db8858a78..54540bf352f319aa25aa9794d10996b979339ea5 100644 (file)
@@ -23,6 +23,8 @@
 #include <deal.II/base/exceptions.h>
 #include <deal.II/base/memory_consumption.h>
 #include <deal.II/base/parallel.h>
+#include <boost/serialization/array.hpp>
+#include <boost/serialization/split_member.hpp>
 
 #include <cstring>
 
@@ -152,6 +154,11 @@ public:
   void insert_back (ForwardIterator begin,
                     ForwardIterator end);
 
+  /**
+   * Fills the vector with size() copies of the given input
+   */
+  void fill (const T &element);
+
   /**
    * Swaps the given vector with the calling vector.
    */
@@ -211,6 +218,22 @@ public:
    */
   size_type memory_consumption () const;
 
+  /**
+   * Write the data of this object to
+   * a stream for the purpose of serialization.
+   */
+  template <class Archive>
+  void save (Archive &ar, const unsigned int version) const;
+
+  /**
+   * Read the data of this object
+   * from a stream for the purpose of serialization.
+   */
+  template <class Archive>
+  void load (Archive &ar, const unsigned int version);
+
+  BOOST_SERIALIZATION_SPLIT_MEMBER()
+
 private:
 
   /**
@@ -444,7 +467,7 @@ inline
 AlignedVector<T>&
 AlignedVector<T>::operator = (const AlignedVector<T> &vec)
 {
-  clear();
+  resize(0);
   resize_fast (vec._end_data - vec._data);
   internal::AlignedVectorMove<T> (vec._data, vec._end_data, _data, true);
   return *this;
@@ -480,8 +503,7 @@ AlignedVector<T>::resize (const size_type size_in,
   // now _size is set correctly, need to set the
   // values
   if (size_in > old_size)
-    internal::AlignedVectorSet<T> (size_in-old_size, init,
-                                   _data+old_size);
+    internal::AlignedVectorSet<T> (size_in-old_size, init, _data+old_size);
 }
 
 
@@ -619,6 +641,16 @@ AlignedVector<T>::insert_back (ForwardIterator begin,
 
 
 
+template < class T >
+inline
+void
+AlignedVector<T>::fill (const T &value)
+{
+  internal::AlignedVectorSet<T> (size(), value, _data);
+}
+
+
+
 template < class T >
 inline
 void
@@ -723,6 +755,39 @@ AlignedVector<T>::end () const
 
 
 
+template < class T >
+template < class Archive >
+inline
+void
+AlignedVector<T>::save (Archive &ar, const unsigned int) const
+{
+  size_type vec_size (size());
+  ar &vec_size;
+  if (vec_size > 0)
+    ar &boost::serialization::make_array(_data, vec_size);
+}
+
+
+
+template < class T >
+template < class Archive >
+inline
+void
+AlignedVector<T>::load (Archive &ar, const unsigned int)
+{
+  size_type vec_size = 0;
+  ar &vec_size ;
+
+  if (vec_size > 0)
+    {
+      reserve(vec_size);
+      ar &boost::serialization::make_array(_data, vec_size);
+      _end_data = _data + vec_size;
+    }
+}
+
+
+
 template < class T >
 inline
 typename AlignedVector<T>::size_type
index fd22fece7945263943d1a4064331d337cea6a43c..af4aa8d9f4d4e1d61f29c166ca9d031d50a0b733 100644 (file)
@@ -1922,12 +1922,8 @@ TableBase<N,T>::TableBase (const TableBase<N,T> &src)
   :
   Subscriptor ()
 {
-  reinit (src.table_size);
-  if (src.n_elements() != 0)
-    internal::AlignedVectorMove<T> (const_cast<T*>(src.values.begin()),
-                                    const_cast<T*>(src.values.end()),
-                                    values.begin(),
-                                    true);
+  values = src.values;
+  reinit (src.table_size, true);
 }
 
 
@@ -2116,12 +2112,9 @@ inline
 TableBase<N,T> &
 TableBase<N,T>::operator = (const TableBase<N,T> &m)
 {
-  reinit (m.size());
-  if (!empty())
-    internal::AlignedVectorMove<T> (const_cast<T*>(m.values.begin()),
-                                    const_cast<T*>(m.values.end()),
-                                    values.begin(),
-                                    true);
+  if (!m.empty())
+    values = m.values;
+  reinit (m.size(), true);
 
   return *this;
 }
@@ -2160,8 +2153,7 @@ TableBase<N,T>::reset_values ()
 {
   // use parallel set operation
   if (n_elements() != 0)
-    dealii::internal::AlignedVectorSet<T> (values.size(), T(),
-                                   values.begin());
+    values.fill(T());
 }
 
 
@@ -2172,8 +2164,7 @@ void
 TableBase<N,T>::fill (const T &value)
 {
   if (n_elements() != 0)
-    dealii::internal::AlignedVectorSet<T> (values.size(), value,
-                                   values.begin());
+    values.fill(value);
 }
 
 
@@ -2206,8 +2197,7 @@ TableBase<N,T>::reinit (const TableIndices<N> &new_sizes,
   // not fast resize, zero out all values)
   values.resize_fast (new_size);
   if (!fast)
-    dealii::internal::AlignedVectorSet<T> (values.size(), T(),
-                                   values.begin());
+    values.fill(T());
 }
 
 

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.