OpenVDB  7.0.0
File.h
Go to the documentation of this file.
1 // Copyright Contributors to the OpenVDB Project
2 // SPDX-License-Identifier: MPL-2.0
3 //
5 
6 #ifndef OPENVDB_IO_FILE_HAS_BEEN_INCLUDED
7 #define OPENVDB_IO_FILE_HAS_BEEN_INCLUDED
8 
9 #include <openvdb/version.h>
10 #include "io.h" // for MappedFile::Notifier
11 #include "Archive.h"
12 #include "GridDescriptor.h"
13 #include <algorithm> // for std::copy()
14 #include <iosfwd>
15 #include <iterator> // for std::back_inserter()
16 #include <map>
17 #include <memory>
18 #include <string>
19 
20 
21 class TestFile;
22 class TestStream;
23 
24 namespace openvdb {
26 namespace OPENVDB_VERSION_NAME {
27 namespace io {
28 
30 class OPENVDB_API File: public Archive
31 {
32 public:
33  using NameMap = std::multimap<Name, GridDescriptor>;
34  using NameMapCIter = NameMap::const_iterator;
35 
36  explicit File(const std::string& filename);
37  ~File() override;
38 
42  File(const File& other);
46  File& operator=(const File& other);
47 
51  SharedPtr<Archive> copy() const override;
52 
55  const std::string& filename() const;
56 
66  bool open(bool delayLoad = true, const MappedFile::Notifier& = MappedFile::Notifier());
67 
69  bool isOpen() const;
70 
72  void close();
73 
76  Index64 getSize() const;
77 
80  Index64 copyMaxBytes() const;
92  void setCopyMaxBytes(Index64 bytes);
93 
95  bool hasGrid(const Name&) const;
96 
98  MetaMap::Ptr getMetadata() const;
99 
101  GridPtrVecPtr getGrids() const;
102 
106  GridPtrVecPtr readAllGridMetadata();
107 
112  GridBase::Ptr readGridMetadata(const Name&);
113 
115  GridBase::Ptr readGrid(const Name&);
118  GridBase::Ptr readGrid(const Name&, const BBoxd&);
119 
121 
124  void write(const GridCPtrVec&, const MetaMap& = MetaMap()) const override;
125 
128  template<typename GridPtrContainerT>
129  void write(const GridPtrContainerT&, const MetaMap& = MetaMap()) const;
130 
134  {
135  public:
136  NameIterator(const NameMapCIter& iter): mIter(iter) {}
137  NameIterator(const NameIterator&) = default;
139 
140  NameIterator& operator++() { mIter++; return *this; }
141 
142  bool operator==(const NameIterator& iter) const { return mIter == iter.mIter; }
143  bool operator!=(const NameIterator& iter) const { return mIter != iter.mIter; }
144 
145  Name operator*() const { return this->gridName(); }
146 
147  Name gridName() const { return GridDescriptor::nameAsString(mIter->second.uniqueName()); }
148 
149  private:
150  NameMapCIter mIter;
151  };
152 
154  NameIterator beginName() const;
155 
157  NameIterator endName() const;
158 
159 private:
161  void readGridDescriptors(std::istream&);
162 
165  NameMapCIter findDescriptor(const Name&) const;
166 
169 
172  GridBase::Ptr readGridByName(const Name&, const BBoxd&);
173 
175  GridBase::ConstPtr readGridPartial(const GridDescriptor&, bool readTopology) const;
176 
178  GridBase::Ptr readGrid(const GridDescriptor&) const;
181  GridBase::Ptr readGrid(const GridDescriptor&, const BBoxd&) const;
184  GridBase::Ptr readGrid(const GridDescriptor&, const CoordBBox&) const;
185 
188  void readGridPartial(GridBase::Ptr, std::istream&, bool isInstance, bool readTopology) const;
189 
193  GridBase::Ptr retrieveCachedGrid(const Name&) const;
194 
195  void writeGrids(const GridCPtrVec&, const MetaMap&) const;
196 
197  MetaMap::Ptr fileMetadata();
198  MetaMap::ConstPtr fileMetadata() const;
199 
200  const NameMap& gridDescriptors() const;
201  NameMap& gridDescriptors();
202 
203  std::istream& inputStream() const;
204 
205  friend class ::TestFile;
206  friend class ::TestStream;
207 
208  struct Impl;
209  std::unique_ptr<Impl> mImpl;
210 };
211 
212 
214 
215 
216 inline void
217 File::write(const GridCPtrVec& grids, const MetaMap& meta) const
218 {
219  this->writeGrids(grids, meta);
220 }
221 
222 
223 template<typename GridPtrContainerT>
224 inline void
225 File::write(const GridPtrContainerT& container, const MetaMap& meta) const
226 {
227  GridCPtrVec grids;
228  std::copy(container.begin(), container.end(), std::back_inserter(grids));
229  this->writeGrids(grids, meta);
230 }
231 
232 } // namespace io
233 } // namespace OPENVDB_VERSION_NAME
234 } // namespace openvdb
235 
236 #endif // OPENVDB_IO_FILE_HAS_BEEN_INCLUDED
#define OPENVDB_API
Helper macros for defining library symbol visibility.
Definition: Platform.h:230
Definition: GridDescriptor.h:19
SharedPtr< const GridBase > ConstPtr
Definition: Grid.h:81
std::function< void(std::string)> Notifier
Definition: io.h:156
std::string Name
Definition: Name.h:17
std::shared_ptr< T > SharedPtr
Definition: Types.h:91
std::multimap< Name, GridDescriptor > NameMap
Definition: File.h:33
NameMap::const_iterator NameMapCIter
Definition: File.h:34
SharedPtr< GridBase > Ptr
Definition: Grid.h:80
NameIterator(const NameMapCIter &iter)
Definition: File.h:136
Grid serializer/unserializer.
Definition: Archive.h:32
Name operator*() const
Definition: File.h:145
Container that maps names (strings) to values of arbitrary types.
Definition: MetaMap.h:19
SharedPtr< MetaMap > Ptr
Definition: MetaMap.h:22
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h:102
SharedPtr< GridPtrVec > GridPtrVecPtr
Definition: Grid.h:512
bool operator!=(const NameIterator &iter) const
Definition: File.h:143
Name gridName() const
Definition: File.h:147
Definition: Exceptions.h:13
SharedPtr< const MetaMap > ConstPtr
Definition: MetaMap.h:23
GridType::Ptr createGrid(const typename GridType::ValueType &background)
Create a new grid of type GridType with a given background value.
Definition: Grid.h:1728
Library and file format version numbers.
Grid archive associated with a file on disk.
Definition: File.h:30
std::vector< GridBase::ConstPtr > GridCPtrVec
Definition: Grid.h:514
bool operator==(const NameIterator &iter) const
Definition: File.h:142
~NameIterator()
Definition: File.h:138
uint64_t Index64
Definition: Types.h:30
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:154
NameIterator & operator++()
Definition: File.h:140