"Fossies" - the Fresh Open Source Software Archive

Member "dune-typetree-2.8.0/dune/typetree/simpletransformationdescriptors.hh" (31 Aug 2021, 4118 Bytes) of package /linux/misc/dune/dune-typetree-2.8.0.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "simpletransformationdescriptors.hh" see the Fossies "Dox" file reference documentation.

    1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    2 // vi: set et ts=4 sw=2 sts=2:
    3 
    4 #ifndef DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH
    5 #define DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH
    6 
    7 #include <array>
    8 #include <memory>
    9 
   10 #include <dune/typetree/nodeinterface.hh>
   11 #include <dune/typetree/nodetags.hh>
   12 #include <dune/common/exceptions.hh>
   13 
   14 
   15 namespace Dune {
   16   namespace TypeTree {
   17 
   18     /** \addtogroup Transformation
   19      *  \ingroup TypeTree
   20      *  \{
   21      */
   22 
   23     template<typename SourceNode, typename Transformation, typename TransformedNode>
   24     struct SimpleLeafNodeTransformation
   25     {
   26 
   27       static const bool recursive = false;
   28 
   29       typedef TransformedNode transformed_type;
   30       typedef std::shared_ptr<transformed_type> transformed_storage_type;
   31 
   32       static transformed_type transform(const SourceNode& s, const Transformation& t)
   33       {
   34         return transformed_type();
   35       }
   36 
   37       static transformed_storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t)
   38       {
   39         return std::make_shared<transformed_type>();
   40       }
   41 
   42     };
   43 
   44 
   45     template<typename SourceNode, typename Transformation, template<typename Child, std::size_t> class TransformedNode>
   46     struct SimplePowerNodeTransformation
   47     {
   48 
   49       static const bool recursive = true;
   50 
   51       template<typename TC>
   52       struct result
   53       {
   54         typedef TransformedNode<TC, StaticDegree<SourceNode>::value> type;
   55         typedef std::shared_ptr<type> storage_type;
   56         static const std::size_t degree = StaticDegree<type>::value;
   57       };
   58 
   59       template<typename TC>
   60       static typename result<TC>::type transform(const SourceNode& s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
   61       {
   62         return typename result<TC>::type(children);
   63       }
   64 
   65       template<typename TC>
   66       static typename result<TC>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::array<std::shared_ptr<TC>,result<TC>::degree>& children)
   67       {
   68         return std::make_shared<typename result<TC>::type>(children);
   69       }
   70 
   71     };
   72 
   73 
   74     template<typename SourceNode, typename Transformation, template<typename Child> class TransformedNode>
   75     struct SimpleDynamicPowerNodeTransformation
   76     {
   77 
   78       static const bool recursive = true;
   79 
   80       template<typename TC>
   81       struct result
   82       {
   83         typedef TransformedNode<TC> type;
   84         typedef std::shared_ptr<type> storage_type;
   85       };
   86 
   87       template<typename TC>
   88       static typename result<TC>::type transform(const SourceNode& s, const Transformation& t, const std::vector<std::shared_ptr<TC>>& children)
   89       {
   90         return typename result<TC>::type(children);
   91       }
   92 
   93       template<typename TC>
   94       static typename result<TC>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, const std::vector<std::shared_ptr<TC>>& children)
   95       {
   96         return std::make_shared<typename result<TC>::type>(children);
   97       }
   98 
   99     };
  100 
  101 
  102     template<typename SourceNode, typename Transformation, template<typename...> class TransformedNode>
  103     struct SimpleCompositeNodeTransformation
  104     {
  105 
  106       static const bool recursive = true;
  107 
  108       template<typename... TC>
  109       struct result
  110       {
  111         typedef TransformedNode<TC...> type;
  112         typedef std::shared_ptr<type> storage_type;
  113       };
  114 
  115       template<typename... TC>
  116       static typename result<TC...>::type transform(const SourceNode& s, const Transformation& t, std::shared_ptr<TC>... children)
  117       {
  118         return typename result<TC...>::type(children...);
  119       }
  120 
  121       template<typename... TC>
  122       static typename result<TC...>::storage_type transform_storage(std::shared_ptr<const SourceNode> s, const Transformation& t, std::shared_ptr<TC>... children)
  123       {
  124         return std::make_shared<typename result<TC...>::type>(children...);
  125       }
  126 
  127     };
  128 
  129     //! \} group Transformation
  130 
  131   } // namespace TypeTree
  132 } //namespace Dune
  133 
  134 #endif // DUNE_TYPETREE_SIMPLETRANSFORMATIONDESCRIPTORS_HH