File: default_accessor.hh

package info (click to toggle)
dune-common 2.11.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,048 kB
  • sloc: cpp: 54,403; python: 4,136; sh: 1,657; makefile: 17
file content (56 lines) | stat: -rw-r--r-- 1,926 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
#ifndef DUNE_COMMON_STD_DEFAULT_ACCESSOR_HH
#define DUNE_COMMON_STD_DEFAULT_ACCESSOR_HH

#include <type_traits>

namespace Dune::Std {

/**
 * \brief A type for indexed access to elements of mdspan.
 * \ingroup CxxUtilities
 *
 * The `default_accessor` class template is the default `AccessorPolicy` used by `mdspan`
 * if no user-specified accessor policy is provided.
 *
 * \tparam Element  The element type. Shall be a complete object type that is neither an
 *                  abstract class type nor an array type. Otherwise, the program is ill-formed.
 */
template <class Element>
class default_accessor
{
public:
  using element_type = Element;
  using data_handle_type = element_type*;
  using reference = element_type&;
  using offset_policy = default_accessor;

public:
  // [mdspan.accessor.default.overview]
  /// \brief Default constructor
  constexpr default_accessor () noexcept = default;

  /// \brief Converting constructor from an accessor with different element type
  template <class OtherElement,
    std::enable_if_t<std::is_convertible_v<OtherElement(*)[], Element(*)[]>, int> = 0>
  constexpr default_accessor (default_accessor<OtherElement>) noexcept {}

  /// \brief Return a reference to the i'th element in the data range starting at `p`
  constexpr reference access (data_handle_type p, std::size_t i) const noexcept
  {
    return p[i];
  }

  /// \brief Return a data handle to the i'th element in the data range starting at `p`
  constexpr data_handle_type offset (data_handle_type p, std::size_t i) const noexcept
  {
    return p + i;
  }
};

} // end namespace Dune::Std

#endif // DUNE_COMMON_STD_DEFAULT_ACCESSOR_HH