DNA Calib 1.1
Project brief
Public Member Functions | Private Attributes | List of all members
trio::FileStreamImpl Class Reference

#include <FileStreamImpl.h>

Inheritance diagram for trio::FileStreamImpl:
Inheritance graph
Collaboration diagram for trio::FileStreamImpl:
Collaboration graph

Public Member Functions

 FileStreamImpl (const char *path_, AccessMode accessMode_, OpenMode openMode_, MemoryResource *memRes_)
 
void open () override
 Open access to the stream. More...
 
void close () override
 Close access to the stream. More...
 
std::uint64_t tell () override
 Get the current position in the stream. More...
 
void seek (std::uint64_t position) override
 Set the current position in the stream. More...
 
std::uint64_t size () override
 Obtain size of stream in bytes. More...
 
std::size_t read (char *destination, std::size_t size) override
 Read bytes from stream into the given buffer. More...
 
std::size_t read (Writable *destination, std::size_t size) override
 Read bytes from this stream into the given stream. More...
 
std::size_t write (const char *source, std::size_t size) override
 Writes bytes from the given buffer to the stream. More...
 
std::size_t write (Readable *source, std::size_t size) override
 Writes bytes from the given stream to this stream. More...
 
MemoryResourcegetMemoryResource ()
 
- Public Member Functions inherited from trio::FileStream
 FileStream ()=default
 
 ~FileStream () override
 
 FileStream (const FileStream &)=delete
 
FileStreamoperator= (const FileStream &)=delete
 
 FileStream (FileStream &&)=default
 
FileStreamoperator= (FileStream &&)=default
 
- Public Member Functions inherited from trio::BoundedIOStream
virtual ~BoundedIOStream ()
 
virtual void open ()=0
 Open access to the stream. More...
 
virtual void close ()=0
 Close access to the stream. More...
 
virtual std::size_t read (char *destination, std::size_t size)=0
 Read bytes from stream into the given buffer. More...
 
virtual std::size_t read (Writable *destination, std::size_t size)=0
 Read bytes from this stream into the given stream. More...
 
virtual std::size_t write (const char *source, std::size_t size)=0
 Writes bytes from the given buffer to the stream. More...
 
virtual std::size_t write (Readable *source, std::size_t size)=0
 Writes bytes from the given stream to this stream. More...
 
virtual std::uint64_t tell ()=0
 Get the current position in the stream. More...
 
virtual void seek (std::uint64_t position)=0
 Set the current position in the stream. More...
 
virtual std::uint64_t size ()=0
 Obtain size of stream in bytes. More...
 

Private Attributes

std::fstream file
 
NativeString filePath
 
AccessMode fileAccessMode
 
OpenMode fileOpenMode
 
std::uint64_t fileSize
 
MemoryResourcememRes
 
StreamStatus status
 

Additional Inherited Members

- Public Types inherited from trio::BoundedIOStream
using AccessMode = trio::AccessMode
 
using OpenMode = trio::OpenMode
 
- Static Public Member Functions inherited from trio::FileStream
static FileStreamcreate (const char *path, AccessMode accessMode, OpenMode openMode, MemoryResource *memRes=nullptr)
 Factory method for creation of a FileStream instance. More...
 
static void destroy (FileStream *instance)
 Method for freeing a FileStream instance. More...
 
- Static Public Attributes inherited from trio::BoundedIOStream
static const sc::StatusCode OpenError {100, "Error opening file"}
 
static const sc::StatusCode ReadError {101, "Error reading file"}
 
static const sc::StatusCode WriteError {102, "Error writing file"}
 
static const sc::StatusCode AlreadyOpenError {103, "File already open"}
 
static const sc::StatusCode SeekError {104, "Error seeking file"}
 
- Protected Member Functions inherited from trio::Controllable
virtual ~Controllable ()
 
- Protected Member Functions inherited from trio::Openable
virtual ~Openable ()
 
- Protected Member Functions inherited from trio::Closeable
virtual ~Closeable ()
 
- Protected Member Functions inherited from trio::Readable
virtual ~Readable ()
 
- Protected Member Functions inherited from trio::Writable
virtual ~Writable ()
 
- Protected Member Functions inherited from trio::Seekable
virtual ~Seekable ()
 
- Protected Member Functions inherited from trio::Bounded
virtual ~Bounded ()
 

Constructor & Destructor Documentation

◆ FileStreamImpl()

trio::FileStreamImpl::FileStreamImpl ( const char *  path_,
AccessMode  accessMode_,
OpenMode  openMode_,
MemoryResource memRes_ 
)
61 :
62 filePath{NativeStringConverter::from(path_, memRes_)},
63 fileAccessMode{accessMode_},
64 fileOpenMode{openMode_},
66 memRes{memRes_} {
67}
NativeString filePath
Definition: FileStreamImpl.h:44
MemoryResource * memRes
Definition: FileStreamImpl.h:48
OpenMode fileOpenMode
Definition: FileStreamImpl.h:46
std::uint64_t fileSize
Definition: FileStreamImpl.h:47
AccessMode fileAccessMode
Definition: FileStreamImpl.h:45
std::uint64_t getFileSizeStd(const NativeCharacter *path)
Definition: FileStreamImpl.cpp:31

Member Function Documentation

◆ close()

void trio::FileStreamImpl::close ( )
overridevirtual

Close access to the stream.

Implements trio::Closeable.

95 {
96 file.close();
97}
std::fstream file
Definition: FileStreamImpl.h:43

References file.

◆ getMemoryResource()

MemoryResource * trio::FileStreamImpl::getMemoryResource ( )
204 {
205 return memRes;
206}

References memRes.

◆ open()

void trio::FileStreamImpl::open ( )
overridevirtual

Open access to the stream.

Implements trio::Openable.

69 {
70 status->reset();
71 if (file.is_open()) {
73 return;
74 }
75
76 std::ios_base::openmode flags{};
77 flags |= (contains(fileAccessMode, AccessMode::Read) ? std::ios_base::in : flags);
78 flags |= (contains(fileAccessMode, AccessMode::Write) ? std::ios_base::out : flags);
79 flags |= (contains(fileOpenMode, OpenMode::Binary) ? std::ios_base::binary : flags);
80 flags |= std::ios_base::ate;
81
84 }
85
86 file.open(filePath.c_str(), flags);
87 if (!file.good()) {
88 status->set(OpenError, filePath.c_str());
89 return;
90 }
91 fileSize = static_cast<std::uint64_t>(file.tellg());
92 seek(0ul);
93}
static void set(StatusCode status)
Definition: Provider.cpp:33
static void reset()
Definition: Provider.cpp:21
static const sc::StatusCode OpenError
Definition: Stream.h:19
static const sc::StatusCode AlreadyOpenError
Definition: Stream.h:22
void seek(std::uint64_t position) override
Set the current position in the stream.
Definition: FileStreamImpl.cpp:103
StreamStatus status
Definition: FileStreamImpl.h:49
void ensureFileExistsStd(const NativeCharacter *path)
Definition: FileStreamImpl.cpp:36
std::enable_if< std::is_enum< TEnum >::value, bool >::type contains(TEnum lhs, TEnum rhs)
Definition: trio/utils/ScopedEnumEx.h:57

References trio::BoundedIOStream::AlreadyOpenError, trio::Binary, trio::contains(), trio::anonymous_namespace{FileStreamImpl.cpp}::ensureFileExistsStd(), file, fileAccessMode, fileOpenMode, filePath, fileSize, trio::BoundedIOStream::OpenError, trio::Read, trio::ReadWrite, sc::StatusProvider::reset(), seek(), sc::StatusProvider::set(), status, and trio::Write.

◆ read() [1/2]

std::size_t trio::FileStreamImpl::read ( char *  destination,
std::size_t  size 
)
overridevirtual

Read bytes from stream into the given buffer.

Parameters
destinationDestination buffer into which the data is going to be read from the stream.
sizeNumber of bytes to read from stream.
Returns
Number of bytes read.

Implements trio::Readable.

116 {
117 if ((destination == nullptr) || file.fail() || !file.is_open() || !contains(fileAccessMode, AccessMode::Read)) {
118 status->set(ReadError, filePath.c_str());
119 return 0ul;
120 }
121
122 file.read(destination, static_cast<std::streamsize>(size));
123 if (!file.good() && !file.eof()) {
124 status->set(ReadError, filePath.c_str());
125 }
126
127 const auto bytesRead = file.gcount();
128 return (bytesRead > 0 ? static_cast<std::size_t>(bytesRead) : 0ul);
129}
static const sc::StatusCode ReadError
Definition: Stream.h:20
std::uint64_t size() override
Obtain size of stream in bytes.
Definition: FileStreamImpl.cpp:200

References trio::contains(), file, fileAccessMode, filePath, trio::Read, trio::BoundedIOStream::ReadError, sc::StatusProvider::set(), size(), and status.

◆ read() [2/2]

std::size_t trio::FileStreamImpl::read ( Writable destination,
std::size_t  size 
)
overridevirtual

Read bytes from this stream into the given stream.

Parameters
destinationDestination stream into which the data is going to be read from this stream.
sizeNumber of bytes to read from stream.
Returns
Number of bytes read.

Implements trio::Readable.

131 {
132 if ((destination == nullptr) || file.fail() || !file.is_open() || !contains(fileAccessMode, AccessMode::Read)) {
133 status->set(ReadError, filePath.c_str());
134 return 0ul;
135 }
136
137 char buffer[bufferSize];
138 while (size > bufferSize) {
139 file.read(buffer, static_cast<std::streamsize>(bufferSize));
140 destination->write(buffer, bufferSize);
141 size -= bufferSize;
142 }
143 file.read(buffer, static_cast<std::streamsize>(size));
144 destination->write(buffer, size);
145
146 if (!file.good() && !file.eof()) {
147 status->set(ReadError, filePath.c_str());
148 }
149 const auto bytesRead = file.gcount();
150 return (bytesRead > 0 ? static_cast<std::size_t>(bytesRead) : 0ul);
151}
constexpr std::size_t bufferSize
Definition: FileStreamImpl.cpp:29

References trio::anonymous_namespace{FileStreamImpl.cpp}::bufferSize, trio::contains(), file, fileAccessMode, filePath, trio::Read, trio::BoundedIOStream::ReadError, sc::StatusProvider::set(), size(), status, and trio::Writable::write().

◆ seek()

void trio::FileStreamImpl::seek ( std::uint64_t  position)
overridevirtual

Set the current position in the stream.

Parameters
positionPosition in the stream relative to it's start, with 0 denoting the start position.

Implements trio::Seekable.

103 {
104 const bool seekable = (position == 0ul || position <= size()) && file.good();
105 if (!seekable) {
106 status->set(SeekError, filePath.c_str());
107 return;
108 }
109
110 file.seekp(static_cast<std::streamoff>(position));
111 if (!file.good()) {
112 status->set(SeekError, filePath.c_str());
113 }
114}
static const sc::StatusCode SeekError
Definition: Stream.h:23

References file, filePath, trio::BoundedIOStream::SeekError, sc::StatusProvider::set(), size(), and status.

Referenced by open().

◆ size()

std::uint64_t trio::FileStreamImpl::size ( )
overridevirtual

Obtain size of stream in bytes.

Returns
Size in bytes.

Implements trio::Bounded.

200 {
201 return fileSize;
202}

References fileSize.

Referenced by read(), seek(), and write().

◆ tell()

std::uint64_t trio::FileStreamImpl::tell ( )
overridevirtual

Get the current position in the stream.

Returns
Position in the stream relative to it's start, with 0 denoting the start position.

Implements trio::Seekable.

99 {
100 return static_cast<std::uint64_t>(file.tellp());
101}

References file.

◆ write() [1/2]

std::size_t trio::FileStreamImpl::write ( const char *  source,
std::size_t  size 
)
overridevirtual

Writes bytes from the given buffer to the stream.

Parameters
sourceSource buffer from which the data is going to be written to the stream.
sizeNumber of bytes to write to the stream.
Returns
Number of bytes written.

Implements trio::Writable.

153 {
154 if ((source == nullptr) || file.fail() || !file.is_open() || !contains(fileAccessMode, AccessMode::Write)) {
155 status->set(WriteError, filePath.c_str());
156 return 0ul;
157 }
158
159 const auto preWritePos = file.tellp();
160 file.write(source, static_cast<std::streamsize>(size));
161 const auto postWritePos = file.tellp();
162
163 if (!file.good()) {
164 status->set(WriteError, filePath.c_str());
165 } else {
166 fileSize = std::max(static_cast<std::uint64_t>(postWritePos), fileSize);
167 }
168
169 return (postWritePos > preWritePos ? static_cast<std::size_t>(postWritePos - preWritePos) : 0ul);
170}
static const sc::StatusCode WriteError
Definition: Stream.h:21

References trio::contains(), file, fileAccessMode, filePath, fileSize, sc::StatusProvider::set(), size(), status, trio::Write, and trio::BoundedIOStream::WriteError.

◆ write() [2/2]

std::size_t trio::FileStreamImpl::write ( Readable source,
std::size_t  size 
)
overridevirtual

Writes bytes from the given stream to this stream.

Parameters
sourceSource stream from which the data is going to be written into this stream.
sizeNumber of bytes to write to the stream.
Returns
Number of bytes written.

Implements trio::Writable.

172 {
173 if ((source == nullptr) || file.fail() || !file.is_open() || !contains(fileAccessMode, AccessMode::Write)) {
174 status->set(WriteError, filePath.c_str());
175 return 0ul;
176 }
177
178 const auto preWritePos = file.tellp();
179
180 char buffer[bufferSize];
181 while (size > bufferSize) {
182 source->read(buffer, bufferSize);
183 file.write(buffer, static_cast<std::streamsize>(bufferSize));
184 size -= bufferSize;
185 }
186 source->read(buffer, size);
187 file.write(buffer, static_cast<std::streamsize>(size));
188
189 const auto postWritePos = file.tellp();
190
191 if (!file.good()) {
192 status->set(WriteError, filePath.c_str());
193 } else {
194 fileSize = std::max(static_cast<std::uint64_t>(postWritePos), fileSize);
195 }
196
197 return (postWritePos > preWritePos ? static_cast<std::size_t>(postWritePos - preWritePos) : 0ul);
198}

References trio::anonymous_namespace{FileStreamImpl.cpp}::bufferSize, trio::contains(), file, fileAccessMode, filePath, fileSize, trio::Readable::read(), sc::StatusProvider::set(), size(), status, trio::Write, and trio::BoundedIOStream::WriteError.

Member Data Documentation

◆ file

std::fstream trio::FileStreamImpl::file
private

Referenced by close(), open(), read(), seek(), tell(), and write().

◆ fileAccessMode

AccessMode trio::FileStreamImpl::fileAccessMode
private

Referenced by open(), read(), and write().

◆ fileOpenMode

OpenMode trio::FileStreamImpl::fileOpenMode
private

Referenced by open().

◆ filePath

NativeString trio::FileStreamImpl::filePath
private

Referenced by open(), read(), seek(), and write().

◆ fileSize

std::uint64_t trio::FileStreamImpl::fileSize
private

Referenced by open(), size(), and write().

◆ memRes

MemoryResource* trio::FileStreamImpl::memRes
private

Referenced by getMemoryResource().

◆ status

StreamStatus trio::FileStreamImpl::status
private

Referenced by open(), read(), seek(), and write().


The documentation for this class was generated from the following files: