25 #include "openPMD/IO/AbstractFilePosition.hpp" 26 #include "openPMD/IO/AbstractIOHandler.hpp" 27 #include "openPMD/IO/AbstractIOHandlerImpl.hpp" 28 #include "openPMD/IO/InvalidatableFile.hpp" 29 #include "openPMD/auxiliary/StringManip.hpp" 30 #include "openPMD/backend/Writable.hpp" 32 #include <unordered_map> 33 #include <unordered_set> 39 template <
typename FilePositionType = AbstractFilePosition >
40 class AbstractIOHandlerImplCommon :
public AbstractIOHandlerImpl
44 explicit AbstractIOHandlerImplCommon( AbstractIOHandler * handler );
46 ~AbstractIOHandlerImplCommon( )
override;
53 std::unordered_map< Writable *, InvalidatableFile >
m_files;
54 std::unordered_set< InvalidatableFile > m_dirty;
58 PE_InvalidatableFile = 0,
64 std::unordered_map< Writable *, InvalidatableFile >::iterator,
66 > getPossiblyExisting( std::string file );
68 void associateWithFile(
Writable * writable, InvalidatableFile file );
74 std::string
fullPath( InvalidatableFile );
94 std::shared_ptr< FilePositionType >
103 virtual std::shared_ptr< FilePositionType >
115 virtual std::shared_ptr< FilePositionType >
120 template <
typename FilePositionType >
128 template <
typename FilePositionType >
130 FilePositionType >::~AbstractIOHandlerImplCommon( ) =
default;
133 template <
typename FilePositionType >
135 std::unordered_map< Writable *, InvalidatableFile >::iterator,
141 auto it = std::find_if(
143 [file]( std::unordered_map<
144 Writable *, InvalidatableFile >::value_type
const & entry ) {
145 return *entry.second == file && entry.second.valid( );
149 InvalidatableFile name;
158 newlyCreated =
false;
162 std::unordered_map< Writable *, InvalidatableFile >::iterator,
bool >(
163 std::move( name ), it, newlyCreated );
167 template <
typename FilePositionType >
169 Writable * writable, InvalidatableFile file )
172 m_files[writable] = std::move( file );
176 template <
typename FilePositionType >
178 InvalidatableFile fileName )
184 template <
typename FilePositionType >
186 std::string fileName )
188 if ( auxiliary::ends_with( m_handler->directory,
"/" ) )
190 return m_handler->directory + fileName;
194 return m_handler->directory +
"/" + fileName;
199 template <
typename FilePositionType >
204 if ( writable->parent )
206 auto file =
m_files.find( writable->parent )->second;
207 associateWithFile( writable, file );
212 return m_files.find( writable )->second;
217 template <
typename FilePositionType >
218 std::shared_ptr< FilePositionType >
222 std::shared_ptr< AbstractFilePosition > res;
224 if ( writable->abstractFilePosition )
226 res = writable->abstractFilePosition;
228 else if ( writable->parent )
230 res = writable->parent->abstractFilePosition;
234 res = std::make_shared< FilePositionType >( );
238 writable->abstractFilePosition = res;
240 return std::dynamic_pointer_cast< FilePositionType >( res );
244 template <
typename FilePositionType >
245 std::shared_ptr< FilePositionType >
247 Writable * writable, std::string extend )
249 if ( !auxiliary::starts_with( extend,
'/' ) )
251 extend =
"/" + extend;
256 writable->abstractFilePosition = res;
std::shared_ptr< FilePositionType > setAndGetFilePosition(Writable *writable, bool write=true)
Figure out the file position of the writable.
Definition: AbstractIOHandlerImplCommon.hpp:219
Wrapper around a shared pointer to:
Definition: InvalidatableFile.hpp:45
virtual std::shared_ptr< FilePositionType > extendFilePosition(std::shared_ptr< FilePositionType > const &, std::string)=0
Interface for communicating between logical and physically persistent data.
Definition: AbstractIOHandler.hpp:68
Public definitions of openPMD-api.
Definition: Date.cpp:29
Layer to mirror structure of logical data and persistent data in file.
Definition: Writable.hpp:55
std::unordered_map< Writable *, InvalidatableFile > m_files
map each Writable to its associated file contains only the filename, without the OS path ...
Definition: AbstractIOHandlerImplCommon.hpp:53
Definition: Writable.hpp:43
virtual std::string filePositionToString(std::shared_ptr< FilePositionType >)=0
InvalidatableFile refreshFileFromParent(Writable *writable)
Get the writable's containing file.
Definition: AbstractIOHandlerImplCommon.hpp:201
Definition: AbstractIOHandlerImpl.hpp:35
std::string fullPath(InvalidatableFile)
Definition: AbstractIOHandlerImplCommon.hpp:177