File: hierarchicvectorwrapper.hh

package info (click to toggle)
dune-functions 2.10.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 1,544 kB
  • sloc: cpp: 14,241; python: 661; makefile: 3
file content (103 lines) | stat: -rw-r--r-- 2,985 bytes parent folder | download
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:

// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later

#ifndef DUNE_PYTHON_FUNCTIONS_HIERARCHICVECTORWRAPPER_HH
#define DUNE_PYTHON_FUNCTIONS_HIERARCHICVECTORWRAPPER_HH

#include <type_traits>
#include <utility>

#include <dune/typetree/utility.hh>

#include <dune/functions/common/indexaccess.hh>

namespace Dune
{

  namespace Python
  {

    // HierarchicalVectorWrapper
    // -------------------------

    template< class V, class C, class Holder = V >
    class HierarchicVectorWrapper
    {
      typedef HierarchicVectorWrapper< V, C, Holder > This;

    public:
      typedef V Vector;

      typedef typename Vector::size_type size_type;

      template< class MultiIndex >
      using Entry = C;

      template< class... Args, std::enable_if_t< std::is_constructible_v< Holder, Args &&... >, int > = 0 >
      HierarchicVectorWrapper ( Args &&... args )
        : holder_( std::forward< Args >( args )... )
      {}

      template< class MultiIndex >
      const Entry< MultiIndex > &operator[] ( const MultiIndex &index ) const
      {
        return Dune::Functions::hybridMultiIndexAccess< const Entry< MultiIndex > & >( vector(), index );
      }

      template< class MultiIndex >
      Entry< MultiIndex > &operator[] ( const MultiIndex &index )
      {
        return Dune::Functions::hybridMultiIndexAccess< Entry< MultiIndex > & >( vector(), index );
      }

      template< class MultiIndex >
      const Entry< MultiIndex > &operator() ( const MultiIndex &index ) const
      {
        return (*this)[ index ];
      }

      template< class MultiIndex >
      Entry< MultiIndex > &operator() ( const MultiIndex &index )
      {
        return (*this)[ index ];
      }

      const Vector &vector () const { return get( holder_ ); }
      Vector &vector () { return get( holder_ ); }

    private:
      template< class H >
      static decltype( static_cast< const Vector & >( std::declval< const H & >() ) ) get ( const H &holder )
      {
        return static_cast< const Vector & >( holder );
      }

      template< class H >
      static decltype( static_cast< Vector & >( std::declval< H & >() ) ) get ( H &holder )
      {
        return static_cast< Vector & >( holder );
      }

      template< class H >
      static decltype( static_cast< const Vector & >( *std::declval< const H & >() ) ) get ( const H &holder )
      {
        return static_cast< const Vector & >( *holder );
      }

      template< class H >
      static decltype( static_cast< Vector & >( *std::declval< H & >() ) ) get ( H &holder )
      {
        return static_cast< Vector & >( *holder );
      }

      Holder holder_;
    };

  } // namespace Python

} // namespace Dune

#endif // #ifndef DUNE_PYTHON_FUNCTIONS_HIERARCHICVECTORWRAPPER_HH