1#ifndef __FIBER_FIELD_HPP
2#define __FIBER_FIELD_HPP "Created 27.02.2001 21:42:27 by werner"
4#include <memcore/defines.hpp>
7#include <memcore/RefPtr.hpp>
8#include <memcore/RefMap.hpp>
9#include <memcore/Creator.hpp>
10#include <memcore/Interface.hpp>
11#include <memcore/Ageable.hpp>
12#include <memcore/Attributes.hpp>
15#include <memcore/shared_mutex.hpp>
17#if __has_include(<flat_map>)
21#include "MemArray.hpp"
22#include "CreativeArrayBase.hpp"
24#include "FragmentSelector.hpp"
25#include "FragmentID.hpp"
26#include "MemArrayProperties.hpp"
27#include "FragmentIDCollection.hpp"
28#include "Iterator.hpp"
29#include "FunctionalCreator.hpp"
42template <
typename Key,
typename Value>
50 using iterator =
typename Container::iterator;
51 using const_iterator =
typename Container::const_iterator;
55static inline bool compare(
const Pair& a,
const Pair& b)
67 if (it == data.end() || it->first !=
pair.
first)
70 it = data.insert(it,
pair);
80 bool erase(
const Key&
key)
83 if (it != data.end() && it->first ==
key)
92 const_iterator
find(
const Key&
key)
const
94 auto it =
std::lower_bound(data.begin(), data.end(), Pair{key, Value{}}, compare);
95 if (it != data.end() && it->first == key)
102 iterator
find(
const Key& key)
104 auto it =
std::lower_bound(data.begin(), data.end(), Pair{key, Value{}}, compare);
105 if (it != data.end() && it->first == key)
112 iterator
begin() {
return data.begin(); }
113 iterator
end() {
return data.end(); }
114 const_iterator
begin()
const {
return data.begin(); }
115 const_iterator
end()
const {
return data.end(); }
116 const_iterator
cbegin()
const {
return data.cbegin(); }
117 const_iterator
cend()
const {
return data.cend(); }
119 void reserve(std::size_t
size)
256#if __has_include(<flat_map>)
257 using fragment_map_t = std::flat_map<FragmentIndex_t, MemCore::RefPtr<CreativeArrayBase> >;
260static constexpr bool use_std__flat_map_for_fragments =
true;
266static constexpr bool use_std__flat_map_for_fragments =
false;
279 void reserve_fragments(
size_t N);
281 void extremeUnction()
override;
287static const CAB_t&CreativeArrayNullPtr();
302 FragmentIndex_t findNumericalIDByName(
const string&FragmentName)
const;
319 return FIC->getFragmentLayout();
333 bool validate(FragmentIndex_t FragmentNumber)
const;
336#ifdef __NO_FIBER_FIELD_DEFAULT_CONSTRUCTOR
383 template <Dims_t DIMS>
387 reserve_fragments( NumberOfFragments.size() );
393 template <Dims_t DIMS>
396 reserve_fragments( NumberOfFragments.size() );
398 if (!myFragmentIDCollection)
404 return myFragmentIDCollection -> setFragmentLayout( NumberOfFragments,
FragmentNamePrefix);
415 template <
class T, Dims_t N>
427 template <
class T, Dims_t N>
439 template <
class T, Dims_t N>
452 template <
class T, Dims_t N>
461 template <
class T, Dims_t N>
469 Ageable::update(CAB);
497 return CA->hasData();
515 const string&ProvenanceInfo)
520 const CAB_t&setPersistentDataByName(
const RefPtr<MemBase>&Mb,
const string&FragmentName,
524 return setPersistentData( Mb, Fid,
Cache );
532 template <
class T, Dims_t N>
546 template <
class T, Dims_t N>
573 return CreativeArrayNullPtr();
575 return setPersistentData( data, MIndex(data->size() ), FragID,
Cache);
602 const type_info&getFieldStorageType()
const;
618 [[deprecated(
"Old version, use getElementFiberType() instead.")]]
621 return getElementFiberType();
645 return FTB->getFiberTypeIndex();
686 return setCreator(
FFC,
Fid );
698 return setCreator( CAB,
Fid );
700 return setCreator(CAB);
722 setCreator(
FC,
fid);
729 setCreator(
FC,
fid);
733 FunctionalCreator&setCompatibleLambda(
const FunctionalCreator::Functor&F,
const RefPtr<FragmentID>&fid=
nullptr )
736 setCompatibleCreator( FC, fid);
743 return setCreator( FC, fid);
750 template <
class Functor>
754 return setLambda( F,
fid);
760 template <
class Functor>
764 return setLambda( F,
fid);
772 return fragments.size();
778 return fragments.size();
781 bool isUnfragmented()
const;
783 bool isFragmented()
const
785 return !isUnfragmented();
792 return getFragmentID( FragmentName );
805 return getCreator( FID );
816 NamedFragment getCreatorByNameF(
const string&FragmentName)
const;
821 [[deprecated(
"Use function getCreatorNumericalID() instead")]]
824 return getCreatorByNumericalID(NumericalID);
833 if (!F)
return getCreator();
836 return getCreatorByName( F->Name() );
868 DEPRECATED(
"Use function getDataByNumericalID() instead",
879 [[deprecated(
"Avoid using this function because of its random results; use with care.")]]
887 [[deprecated(
"Avoid using this function because of its random results; use with care.")]]
898 [[deprecated(
"Avoid using this function because of its random results; use with care.")]]
908 return Mb->getChunk();
928 [[deprecated(
"Use iterate() via std::function instead")]]
933 [[deprecated(
"Use iterate() via std::function instead")]]
937 return iterate(myFunctor,
FS);
941 [[deprecated(
"Use iterate() via std::function instead")]]
944 FragmentFunctor<T> myFunctor(t);
945 return iterate(myFunctor, FS);
953 Ageable getMostRecentCreatorAge()
const;
954 Ageable getMostRecentAttributeAge()
const;
956 bool hasFragmentsNewerThan(
const Ageable&
A)
const;
1002 Dims_t Dims()
const;
1014 bool isCompatible(
const Field&F);
1027 enum class CreationFailAlternative
1040 CreationFailAlternative = CreationFailAlternative::Persistent,
1044 const string&FragmentName,
1045 CreationFailAlternative = CreationFailAlternative::Persistent,
1059 template <Dims_t N,
class T>
1063 Field::CreationFailAlternative
FailMode = Field::CreationFailAlternative::Persistent,
1083 template <Dims_t N,
class T>
1087 Field::CreationFailAlternative
FailMode = Field::CreationFailAlternative::Persistent,
1099 template <Dims_t Dims>
1104 return ::Fiber::setFragmentOffset( *
FID, Offset);
1123 return {
nullptr,
nullptr};
1125 return { F, F->makeFragmentID(FragmentName) };
1140 return FF.first->setPersistentData(Mb,
FF.second );
1157 return Result =
FF.first->getCreator(
FF.second );
1166 return FF.first->setCreator(theCreator,
FF.second );
1182 return { F, F.makeFragmentID(FragmentName) };
1196 return FF.first.setPersistentData(Mb,
FF.second );
1210 return FF.
first.setCreator(theCreator, FF.
second );
1223 return Result =
FF.first.getCreator(
FF.second );
1236template <
class Functor>
1243template <
class Functor>
1246 return F.setFunctor( Lambda );
1251 const FunctionalCreator::Functor&F)
1254 return FF.first->setFunctionalCreator(F, FF.second );
1260 const FunctionalCreator::Functor&F)
1262 return FF.first.setFunctionalCreator(F, FF.second );
1269 return F.iterate_fragments(t);
1276 return F->iterate_fragments(t);
constexpr complex< _Tp > & operator+=(const complex< _Up > &)
gslice_array< _Tp > operator[](const gslice &__s)
valarray< size_t > size() const
constexpr _InputIterator find(_InputIterator __first, _InputIterator __last, const _Tp &__val)
constexpr _ForwardIterator lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp &__val)
basic_string< char > string
constexpr auto cend(const _Container &__cont) noexcept(noexcept(std::end(__cont))) -> decltype(std::end(__cont))
constexpr auto empty(const _Container &__cont) noexcept(noexcept(__cont.empty())) -> decltype(__cont.empty())
constexpr auto begin(_Container &__cont) -> decltype(__cont.begin())
constexpr auto end(_Container &__cont) -> decltype(__cont.end())
constexpr auto cbegin(const _Container &__cont) noexcept(noexcept(std::begin(__cont))) -> decltype(std::begin(__cont))
void insert(_InputIterator __first, _InputIterator __last)
Base class for multidimensional arrays that employ deferred storage, i.e.
Definition CreativeArrayBase.hpp:75
An iterator with an optional DataCreator, which is just a class to intercept creation of data along a...
Definition CreativeIterator.hpp:34
A class describing an n-dimensional space at runtime.
Definition field/DynamicSize.hpp:29
A Field is a collection of CreativeArrayBase reference pointers which are accessed via FragmentID obj...
Definition Field.hpp:245
bool isType(const TypeList_t &TL) const
Check if the type of this field is contained in the given type list.
Definition Field.hpp:637
Field(const MultiIndex< DIMS > &NumberOfFragments, const string &FragmentNamePrefix)
Create a field with a multi-dimensional regular layout for the fragments.
Definition Field.hpp:384
bool addFiberType(TypeList_t &TypeList) const
Add the type used by this field to the given TypeList.
Definition Field.hpp:662
Field(const MemCore::MemVector< T > &Data, const MultiIndex< N > &Size, const RefPtr< FragmentIDCollection > &theFragmentIDCollection=nullptr)
Construct an unfragmented field from a MemVector and a MultiIndex.
Definition Field.hpp:453
MultiIndex< Dims > & setFragmentOffset(const string &FragmentName, const MultiIndex< Dims > &Offset)
Set a fragment's index offset.
Definition Field.hpp:1100
const CAB_t & setPersistentData1D(const MemCore::RefPtr< Chunk< T > > &data, const RefPtr< FragmentID > &FragID=nullptr, const RefPtr< MemCore::Cache > &Cache=MemCore::Cache::MemCache())
A convenience function to set a field's data from a Chunk of data, interpreting them as one-dimension...
Definition Field.hpp:568
FunctionalCreator & setLambda(const FunctionalCreator::Functor &F, const RefPtr< FragmentID > &fid=nullptr)
Definition Field.hpp:719
unsigned iterate_parallel(const FragmentIterator_t &FI, bool copy_map_internally=false) const
Iterate over all fragments in parallel.
Definition Field.hpp:986
size_t nFragments() const
The number of fragments in this field.
Definition Field.hpp:770
RefPtr< CreativeArrayBase > operator<<(const FieldFragmentRef &FF, const RefPtr< MemBase > &Mb)
Set a data set to a Field fragment:
Definition Field.hpp:1194
RefPtr< CreativeArrayBase > getCompatibleCreator(const RefPtr< FragmentID > &F=nullptr) const
Get a creator from a fragment ID that is NAMED similar to one fragment here.
Definition Field.hpp:831
bool hasData(const RefPtr< FragmentID > &FID=nullptr) const
Check if there are data on this field fragment.
Definition Field.hpp:491
unsigned iterate(bool parallel, const FragmentIterator_t &FI, bool copy_map_internally=false) const
Same as iterate(const FragmentIterator_t&, bool), just other order of arguments for convenience.
Definition Field.hpp:977
size_t NumberOfFragments() const
The number of fragments in this field.
Definition Field.hpp:776
Field(const MemCore::RefPtr< MemArray< N, T > > &MemRefPtr, const RefPtr< FragmentIDCollection > &theFragmentIDCollection=nullptr)
Convenience function initializing from a RefPtr<> to some MemArray.
Definition Field.hpp:428
Field(const MemCore::RefPtr< MemCore::TypedChunk< T > > &Data, const MultiIndex< N > &Size, const RefPtr< FragmentIDCollection > &theFragmentIDCollection=nullptr)
Construct an unfragmented field from a Chunk of data and multidimensional index.
Definition Field.hpp:462
RefPtr< CreativeArrayBase > operator>>(const FieldFragmentRef &FF, Field::CAB_t &Result)
Get a creator:
Definition Field.hpp:1221
std::pair< RefPtr< MemArray< N, T > >, RefPtr< CreativeArrayBase > > createData(const MultiIndex< N > &Size, const RefPtr< FragmentID > &fid=nullptr, Field::CreationFailAlternative FailMode=Field::CreationFailAlternative::Persistent, const WeakPtr< MemCore::Cache > &theCache=MemCore::Cache::MemCache())
Create a mem array and insert it as a fragment to the Field.
Definition Field.hpp:1061
std::function< bool(const RefPtr< FragmentID > &, const RefPtr< CreativeArrayBase > &)> FragmentIterator_t
Callback type for functions iterating over Field fragments.
Definition Field.hpp:951
const CAB_t & setPersistentData(Chunk< T > *Mb, const MultiIndex< N > &Dimensions, const RefPtr< FragmentID > &FragID=nullptr, const RefPtr< MemCore::Cache > &Cache=MemCore::Cache::MemCache())
A convenience function to set a field's data from a Chunk of data.
Definition Field.hpp:547
RefPtr< CreativeArrayBase > operator<<(const FieldFragment &FF, const RefPtr< MemBase > &Mb)
Set a data set to a Field fragment:
Definition Field.hpp:1137
const CAB_t & setPersistentData(const MemCore::RefPtr< Chunk< T > > &Mb, const MultiIndex< N > &Dimensions, const RefPtr< FragmentID > &FragID=nullptr, const RefPtr< MemCore::Cache > &Cache=MemCore::Cache::MemCache())
A convenience function to set a field's data from a Chunk of data.
Definition Field.hpp:533
bool setFragmentLayout(const MultiIndex< DIMS > &NumberOfFragments, const string &FragmentNamePrefix)
Add a multi-dimensional regular layout for the fragments if it had no layout yet.
Definition Field.hpp:394
FunctionalCreator & setFunctor(const Functor &F, const RefPtr< FragmentID > &fid=nullptr)
Alias for setLambda().
Definition Field.hpp:752
RefPtr< MemBase > getCompatibleData(const RefPtr< FragmentID > &F=nullptr) const
Get data from a fragment ID that is NAMED similar to one fragment here.
Definition Field.hpp:917
RefPtr< CreativeArrayBase > operator>>(const FieldFragment &FF, Field::CAB_t &Result)
Set a data creator to a Field fragment:
Definition Field.hpp:1154
const RefPtr< CreativeArrayBase > & setCompatibleCreator(const RefPtr< CreativeArrayBase > &CAB, const RefPtr< FragmentID > &fid=nullptr)
Set the creator for a fragment ID on a different Skeleton such that the fragment IDs are different,...
Definition Field.hpp:693
Field(const MemCore::WeakPtr< MemArray< N, T > > &MemRefPtr, const RefPtr< FragmentIDCollection > &theFragmentIDCollection=nullptr)
Convenience function initializing from a RefPtr<> to some MemArray.
Definition Field.hpp:440
std::pair< RefPtr< MemArray< N, T > >, RefPtr< CreativeArrayBase > > createData(const MultiIndex< N > &Size, const string &fragmentname, Field::CreationFailAlternative FailMode=Field::CreationFailAlternative::Persistent, const WeakPtr< MemCore::Cache > &theCache=MemCore::Cache::MemCache())
Create a mem array and insert it as a fragment to the Field under the given fragmentname:
Definition Field.hpp:1085
RefPtr< MemCore::ChunkBase > getChunk(const RefPtr< FragmentID > &FID=nullptr) const
Return the stored memory chunk associated with this array.
Definition Field.hpp:905
FunctionalCreator & setFunctor(const RefPtr< FragmentID > &fid, const Functor &F)
Alias for setLambda().
Definition Field.hpp:762
Field(const MemCore::Ref< MemArray< N, T > > &MemRefPtr, const RefPtr< FragmentIDCollection > &theFragmentIDCollection=nullptr)
Convenience function initializing from a Ref<> to some MemArray.
Definition Field.hpp:416
Convenience base class.
Definition FragmentIDCollection.hpp:153
A collection of fragment identifiers with bijective mapping to an integer fragment number.
Definition FragmentIDCollection.hpp:19
Identification information about a field's fragment.
Definition FragmentID.hpp:42
virtual bool apply(int FragmentIndex, const RefPtr< CreativeArrayBase > &)=0
Iteration callback function.
Base class for iterators over the fragments of a field.
Definition FragmentID.hpp:249
Definition FunctionalCreator.hpp:52
Implementation of an Iterator to a sequence of elements, which might be contiguous or a projection of...
Definition vector/Iterator.hpp:525
Class for N-dimensional MultiArrays with MemCore memory management.
Definition MemArray.hpp:34
Domain-specific class of objects that can be owned.
Definition Ownable.hpp:81
void addOwner(const Container &theOwner, const MemCore::Ageable &theNewAge)
Add some owner and broadcast a new age to all Ownerrs.
Definition Ownable.hpp:163
Attributes with an age that allows to keep track when the attributes had been saved last.
Definition CreativeArrayBase.hpp:32
static RefPtr< Cache, CacheBase > & MemCache()
MemSizeConfig< sizeof(void *)>::memsize_t memsize_t
Anemone_Context_t operator<<(Anemone &A, VRenderContext &VC)
MemCore::WeakPtr< VRenderContext::RenderParameter > operator<<=(const Anemone_Context_String_t &ACS, const Value &V)
Given a fragmented field of curvilinear coordinates, (3D array of coordinates), build a uniform Grid ...
Definition FAQ.dox:2
bool containsType(const TypeList_t &TL, const type_info &what)
Investigate if a certain type is contained in a given type list.
Definition FiberType.cpp:228
gridop_API RefPtr< Grid > DEPRECATED("Use grid/types/RegularGrid3D.hpp:UniformGrid3D instead", createUniformGrid(const string &InputGridname, const Info< Skeleton > &Level, const string &OutputGridname, const MultiIndex< 3 > &Resolution, const RefPtr< Eagle::BoundingBox > &SubBox=NullPtr()))
Create a uniform Grid from a given Grid.
typename Ownable< OwnedObjectType, ContainerBase >::Container OwnerOf
Shortcut to find the owning type.
Definition Ownable.hpp:265
Definition fs/init.hpp:20
Definition FiberTypeIndex.hpp:12
A set of types.
Definition FiberType.hpp:213