]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Introduce begin/end_raw and switch element access to const&
authorDaniel Arndt <daniel.arndt@iwr.uni-heidelberg.de>
Thu, 25 Jan 2018 09:13:07 +0000 (10:13 +0100)
committerDaniel Arndt <daniel.arndt@iwr.uni-heidelberg.de>
Thu, 25 Jan 2018 23:10:39 +0000 (00:10 +0100)
doc/news/changes/minor/20180125DanielArndt [new file with mode: 0644]
include/deal.II/base/symmetric_tensor.h
include/deal.II/base/tensor.h

diff --git a/doc/news/changes/minor/20180125DanielArndt b/doc/news/changes/minor/20180125DanielArndt
new file mode 100644 (file)
index 0000000..71160b0
--- /dev/null
@@ -0,0 +1,5 @@
+New: Tensor::begin_raw, Tensor::end_raw, SymmetricTensor::begin_raw
+and SymmetricTensor::end_raw provide access to the underlying storage for Tensor
+and SymmetricTensor.
+<br>
+(Daniel Arndt, 2018/01/25)
index df62374d06faf07c3129f8235d5c41a7213ea973..cc621fb730ba401a45026c6d2166b03e22bf0153 100644 (file)
@@ -603,6 +603,31 @@ public:
   explicit
   SymmetricTensor (const SymmetricTensor<rank_,dim,OtherNumber> &initializer);
 
+  /**
+   * Return a pointer to the first element of the underlying storage.
+   */
+  Number *
+  begin_raw();
+
+  /**
+   * Return a const pointer to the first element of the underlying storage.
+   */
+  const Number *
+  begin_raw() const;
+
+  /**
+   * Return a pointer to the element past the end of the underlying storage.
+   */
+  Number *
+  end_raw();
+
+  /**
+   * Return a const pointer to the element past the end of the underlying
+   * storage.
+   */
+  const Number *
+  end_raw() const;
+
   /**
    * Assignment operator from symmetric tensors with different underlying scalar type.
    * This obviously requires that the @p OtherNumber type is convertible to
@@ -707,9 +732,9 @@ public:
   Number &operator() (const TableIndices<rank_> &indices);
 
   /**
-   * Return an element by value.
+   * Return a @p const reference to the value referred to by the argument.
    */
-  Number operator() (const TableIndices<rank_> &indices) const;
+  const Number &operator() (const TableIndices<rank_> &indices) const;
 
   /**
    * Access the elements of a row of this symmetric tensor. This function is
@@ -726,11 +751,11 @@ public:
   operator [] (const unsigned int row);
 
   /**
-   * Return an element by value.
+   * Return a @p const reference to the value referred to by the argument.
    *
    * Exactly the same as operator().
    */
-  Number
+  const Number &
   operator [] (const TableIndices<rank_> &indices) const;
 
   /**
@@ -746,7 +771,7 @@ public:
    * <tt>s.access_raw_entry(unrolled_index)</tt> does the same as
    * <tt>s[s.unrolled_to_component_indices(i)]</tt>, but more efficiently.
    */
-  Number
+  const Number &
   access_raw_entry (const unsigned int unrolled_index) const;
 
   /**
@@ -1684,7 +1709,7 @@ namespace internal
 
   template <int dim, typename Number>
   inline
-  Number
+  const Number &
   symmetric_tensor_access (const TableIndices<2> &indices,
                            const typename SymmetricTensorAccessors::StorageType<2,dim,Number>::base_tensor_type &data)
   {
@@ -1833,7 +1858,7 @@ namespace internal
 
   template <int dim, typename Number>
   inline
-  Number
+  const Number &
   symmetric_tensor_access (const TableIndices<4> &indices,
                            const typename SymmetricTensorAccessors::StorageType<4,dim,Number>::base_tensor_type &data)
   {
@@ -1952,7 +1977,7 @@ SymmetricTensor<rank_,dim,Number>::operator () (const TableIndices<rank_> &indic
 
 template <int rank_, int dim, typename Number>
 inline
-Number
+const Number &
 SymmetricTensor<rank_,dim,Number>::operator ()
 (const TableIndices<rank_> &indices) const
 {
@@ -2021,7 +2046,7 @@ SymmetricTensor<rank_,dim,Number>::operator [] (const unsigned int row)
 
 template <int rank_, int dim, typename Number>
 inline
-Number
+const Number &
 SymmetricTensor<rank_,dim,Number>::operator [] (const TableIndices<rank_> &indices) const
 {
   return operator()(indices);
@@ -2039,6 +2064,45 @@ SymmetricTensor<rank_,dim,Number>::operator [] (const TableIndices<rank_> &indic
 
 
 
+template <int rank_, int dim, typename Number>
+inline
+Number *
+SymmetricTensor<rank_,dim,Number>::begin_raw()
+{
+  return std::addressof(this->access_raw_entry(0));
+}
+
+
+
+template <int rank_, int dim, typename Number>
+inline
+const Number *
+SymmetricTensor<rank_,dim,Number>::begin_raw() const
+{
+  return std::addressof(this->access_raw_entry(0));
+}
+
+
+
+template <int rank_, int dim, typename Number>
+inline
+Number *
+SymmetricTensor<rank_,dim,Number>::end_raw()
+{
+  return begin_raw()+n_independent_components;
+}
+
+
+
+template <int rank_, int dim, typename Number>
+inline
+const Number *
+SymmetricTensor<rank_,dim,Number>::end_raw() const
+{
+  return begin_raw()+n_independent_components;
+}
+
+
 
 namespace internal
 {
@@ -2070,7 +2134,7 @@ namespace internal
 
 template <int rank_, int dim, typename Number>
 inline
-Number
+const Number &
 SymmetricTensor<rank_,dim,Number>::access_raw_entry (const unsigned int index) const
 {
   AssertIndexRange (index, n_independent_components);
index 18a7821e4633874ba13e62b6fe356bfab2a02e7c..1c25a60d218fccabf5fb4d10f823c5d2c31c56e9 100644 (file)
@@ -151,6 +151,31 @@ public:
   template <typename OtherNumber>
   Tensor (const OtherNumber &initializer);
 
+  /**
+   * Return a pointer to the first element of the underlying storage.
+   */
+  Number *
+  begin_raw();
+
+  /**
+   * Return a const pointer to the first element of the underlying storage.
+   */
+  const Number *
+  begin_raw() const;
+
+  /**
+   * Return a pointer to the element past the end of the underlying storage.
+   */
+  Number *
+  end_raw();
+
+  /**
+   * Return a const pointer to the element past the end of the underlying
+   * storage.
+   */
+  const Number *
+  end_raw() const;
+
   /**
    * Return a reference to the encapsulated Number object. Since rank-0
    * tensors are scalars, this is a natural operation.
@@ -425,6 +450,30 @@ public:
    */
   Number &operator [] (const TableIndices<rank_> &indices);
 
+  /**
+   * Return a pointer to the first element of the underlying storage.
+   */
+  Number *
+  begin_raw();
+
+  /**
+   * Return a const pointer to the first element of the underlying storage.
+   */
+  const Number *
+  begin_raw() const;
+
+  /**
+   * Return a pointer to the element past the end of the underlying storage.
+   */
+  Number *
+  end_raw();
+
+  /**
+   * Return a pointer to the element past the end of the underlying storage.
+   */
+  const Number *
+  end_raw() const;
+
   /**
    * Assignment operator from tensors with different underlying scalar type.
    * This obviously requires that the @p OtherNumber type is convertible to @p
@@ -653,6 +702,7 @@ DEAL_II_CUDA_HOST_DEV Tensor<0,dim,Number>::Tensor ()
 }
 
 
+
 template <int dim, typename Number>
 template <typename OtherNumber>
 inline
@@ -662,6 +712,7 @@ Tensor<0,dim,Number>::Tensor (const OtherNumber &initializer)
 }
 
 
+
 template <int dim, typename Number>
 template <typename OtherNumber>
 inline
@@ -671,6 +722,47 @@ Tensor<0,dim,Number>::Tensor (const Tensor<0,dim,OtherNumber> &p)
 }
 
 
+
+template <int dim, typename Number>
+inline
+Number *
+Tensor<0,dim,Number>::begin_raw()
+{
+  return std::addressof(value);
+}
+
+
+
+template <int dim, typename Number>
+inline
+const Number *
+Tensor<0,dim,Number>::begin_raw() const
+{
+  return std::addressof(value);
+}
+
+
+
+template <int dim, typename Number>
+inline
+Number *
+Tensor<0,dim,Number>::end_raw()
+{
+  return begin_raw()+n_independent_components;
+}
+
+
+
+template <int dim, typename Number>
+inline
+const Number *
+Tensor<0,dim,Number>::end_raw() const
+{
+  return begin_raw()+n_independent_components;
+}
+
+
+
 template <int dim, typename Number>
 inline
 DEAL_II_CUDA_HOST_DEV Tensor<0,dim,Number>::operator Number &()
@@ -945,6 +1037,7 @@ Tensor<rank_,dim,Number>::operator[] (const TableIndices<rank_> &indices) const
 }
 
 
+
 template <int rank_, int dim, typename Number>
 inline
 Number &
@@ -956,6 +1049,47 @@ Tensor<rank_,dim,Number>::operator[] (const TableIndices<rank_> &indices)
 }
 
 
+
+template <int rank_, int dim, typename Number>
+inline
+Number *
+Tensor<rank_,dim,Number>::begin_raw()
+{
+  return std::addressof(this->operator[](this->unrolled_to_component_indices(0)));
+}
+
+
+
+template <int rank_, int dim, typename Number>
+inline
+const Number *
+Tensor<rank_,dim,Number>::begin_raw() const
+{
+  return std::addressof(this->operator[](this->unrolled_to_component_indices(0)));
+}
+
+
+
+template <int rank_, int dim, typename Number>
+inline
+Number *
+Tensor<rank_,dim,Number>::end_raw()
+{
+  return begin_raw()+n_independent_components;
+}
+
+
+
+template <int rank_, int dim, typename Number>
+inline
+const Number *
+Tensor<rank_,dim,Number>::end_raw() const
+{
+  return begin_raw()+n_independent_components;
+}
+
+
+
 template <int rank_, int dim, typename Number>
 template <typename OtherNumber>
 inline

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.