1#ifndef __FIBER_BASEOP_REFINEMENTRECURSION_HPP
2#define __FIBER_BASEOP_REFINEMENTRECURSION_HPP
4#include <grid/types/RefinedFragmentSkeleton.hpp>
13template <
class FragmentContext>
14using RefinementAllowanceFunction = std::function< std::tuple<bool, FragmentContext >(
const RefPtr<Skeleton>&,
const RefPtr<FragmentID>&)>;
16template <
class FragmentContext,
class RecursionCriterium>
17using RefinementContinuationFunction = std::function< std::tuple<bool, RecursionCriterium>(
const FragmentContext&,
const RefPtr<FragmentID>&)>;
19template <
class RecursionCriterium>
20using RefinementFragmentEmitFunction = std::function<bool(
const RecursionCriterium&TerminalCriteria,
const RefPtr<FragmentID>&)>;
27template <
class FragmentContext,
class RecursionCriterium>
28bool ConditionalRecursion(
const RefPtr<Grid>&G,
const SkeletonID&ParentSid,
const RefPtr<FragmentID>&ParentID,
29 const RefinementAllowanceFunction<FragmentContext>&isAllowedFragment,
30 const RefinementContinuationFunction<FragmentContext,RecursionCriterium>&wantFurtherRefinement,
31 const RefinementFragmentEmitFunction<RecursionCriterium>&emitKid,
32 const RecursionCriterium&ParentFragmentCriteria
35int FragmentRefinementLayoutDimension = 3;
40RefinedFragmentSkeleton Refinement(G, ParentSid, ChildrenSid, FragmentRefinementLayoutDimension);
42RefPtr<Skeleton> ParentSkeleton = Refinement.getParentSkeleton();
43 if (Refinement && ParentSkeleton && Refinement.getChildSkeleton() )
46 if (std::get<0>(FragmentRefinementAllowance))
49 KidsThatNeedFurtherRecursion,
50 KidsThatNeedNoRecursion;
52 Refinement.iterateChildren(ParentID,
54 &KidsThatNeedFurtherRecursion,
55 &KidsThatNeedNoRecursion ,
56 &FragmentRefinementAllowance ,
58 ](
const RefPtr<FragmentID>&KidID)
61 NeedMoreRefinement = wantFurtherRefinement( std::get<1>(FragmentRefinementAllowance), KidID);
62 if (std::get<0>(NeedMoreRefinement))
64 KidsThatNeedFurtherRecursion.
emplace_front( KidID, std::get<1>(NeedMoreRefinement) );
68 KidsThatNeedNoRecursion.
emplace_front( KidID, std::get<1>(NeedMoreRefinement) );
74 if (!KidsThatNeedFurtherRecursion.
empty())
77 for(
const auto&Kid : KidsThatNeedFurtherRecursion)
79 const RefPtr<FragmentID>&KidID = std::get<0>(Kid);
80 if (!ConditionalRecursion(G, ChildrenSid, KidID, isAllowedFragment, wantFurtherRefinement, emitKid, std::get<1>(Kid) ))
83 for(
const auto&Kid : KidsThatNeedNoRecursion)
85 const RefPtr<FragmentID>&KidID = std::get<0>(Kid);
86 if (!emitKid( std::get<1>(Kid), KidID ))
95 return emitKid( ParentFragmentCriteria, ParentID );
98template <
class FragmentContext,
class RecursionCriterium>
99void RefinementRecursion(
const RefPtr<Grid>&G,
const SkeletonID&ConnectivitySid,
const RefPtr<Field>&ConnectivityField,
100 const RefinementAllowanceFunction<FragmentContext>&isAllowedFragment,
101 const RefinementContinuationFunction<FragmentContext,RecursionCriterium>&wantFurtherRefinement,
102 const RefinementFragmentEmitFunction<RecursionCriterium>&emitKid,
103 const RecursionCriterium&ParentFragmentCriteria)
105 ConnectivityField->Iterate( [G, ConnectivitySid,
106 isAllowedFragment, wantFurtherRefinement, emitKid, ParentFragmentCriteria ]
107 (
const RefPtr<FragmentID>&myFragmentID,
const RefPtr<CreativeArrayBase>&)
109 ConditionalRecursion<FragmentContext,RecursionCriterium>
110 (G, ConnectivitySid, myFragmentID, isAllowedFragment, wantFurtherRefinement, emitKid, ParentFragmentCriteria );
116template <
class FragmentContext,
class RecursionCriterium>
117void RefinementRecursion(
const RefPtr<Grid>&G,
const SkeletonID&ConnectivitySid,
const RefPtr<Skeleton>&Vertices,
118 const RefinementAllowanceFunction<FragmentContext>&isAllowedFragment,
119 const RefinementContinuationFunction<FragmentContext,RecursionCriterium>&wantFurtherRefinement,
120 const RefinementFragmentEmitFunction<RecursionCriterium>&emitKid,
121 const RecursionCriterium&ParentFragmentCriteria)
125RefPtr<Skeleton> ConnectivitySkeleton = (*G)(ConnectivitySid);
127 if (!ConnectivitySkeleton)
return;
129RefPtr<Representation> Connectivity = (*ConnectivitySkeleton)(Vertices);
130 if (!Connectivity)
return;
131RefPtr<Field> ConnectivityField = Connectivity->getPositions();
133 RefinementRecursion<FragmentContext,RecursionCriterium>
134 (G, ConnectivitySid, ConnectivityField, isAllowedFragment, wantFurtherRefinement, emitKid, ParentFragmentCriteria );
137template <
class FragmentContext,
class RecursionCriterium>
138void RefinementRecursion(
const RefPtr<Grid>&G,
const SkeletonID&ConnectivitySid,
139 const RefinementAllowanceFunction<FragmentContext>&isAllowedFragment,
140 const RefinementContinuationFunction<FragmentContext,RecursionCriterium>&wantFurtherRefinement,
141 const RefinementFragmentEmitFunction<RecursionCriterium>&emitKid,
142 const RecursionCriterium&ParentFragmentCriteria)
146 RefinementRecursion<FragmentContext,RecursionCriterium>
148 isAllowedFragment, wantFurtherRefinement, emitKid, ParentFragmentCriteria );
reference emplace_front(_Args &&... __args)
bool empty() const noexcept
static SkeletonID nextRefinement(const SkeletonID &Sid, int refinement_increment)
Create a SkeletonID that is refined by a certain increment.
Definition SkeletonID.hpp:71
RefPtr< Skeleton > findVertices(int TotalRefinement=-1) const
Find the Skeleton describing the Vertices on this Grid.
Definition SkeletonMap.cpp:285
Given a fragmented field of curvilinear coordinates, (3D array of coordinates), build a uniform Grid ...
Definition FAQ.dox:2