/src/serenity/AK/Stream.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2021, sin-ack <sin-ack@protonmail.com> |
3 | | * Copyright (c) 2022, the SerenityOS developers. |
4 | | * |
5 | | * SPDX-License-Identifier: BSD-2-Clause |
6 | | */ |
7 | | |
8 | | #pragma once |
9 | | |
10 | | #include <AK/Concepts.h> |
11 | | #include <AK/Error.h> |
12 | | #include <AK/Format.h> |
13 | | #include <AK/Forward.h> |
14 | | #include <AK/StringView.h> |
15 | | #include <AK/Traits.h> |
16 | | |
17 | | namespace AK { |
18 | | |
19 | | /// The base, abstract class for stream operations. This class defines the |
20 | | /// operations one can perform on every stream. |
21 | | /// Operations without a sensible default that are unsupported by an implementation |
22 | | /// of a Stream should return EBADF as an error. |
23 | | class Stream { |
24 | | public: |
25 | | /// Reads into a buffer, with the maximum size being the size of the buffer. |
26 | | /// The amount of bytes read can be smaller than the size of the buffer. |
27 | | /// Returns either the bytes that were read, or an errno in the case of |
28 | | /// failure. |
29 | | virtual ErrorOr<Bytes> read_some(Bytes) = 0; |
30 | | /// Tries to fill the entire buffer through reading. Returns whether the |
31 | | /// buffer was filled without an error. |
32 | | virtual ErrorOr<void> read_until_filled(Bytes); |
33 | | /// Reads the stream until EOF, storing the contents into a ByteBuffer which |
34 | | /// is returned once EOF is encountered. The block size determines the size |
35 | | /// of newly allocated chunks while reading. |
36 | | virtual ErrorOr<ByteBuffer> read_until_eof(size_t block_size = 4096); |
37 | | /// Discards the given number of bytes from the stream. As this is usually used |
38 | | /// as an efficient version of `read_until_filled`, it returns an error |
39 | | /// if reading failed or if not all bytes could be discarded. |
40 | | /// Unless specifically overwritten, this just uses read() to read into an |
41 | | /// internal stack-based buffer. |
42 | | virtual ErrorOr<void> discard(size_t discarded_bytes); |
43 | | |
44 | | /// Tries to write the entire contents of the buffer. It is possible for |
45 | | /// less than the full buffer to be written. Returns either the amount of |
46 | | /// bytes written into the stream, or an errno in the case of failure. |
47 | | virtual ErrorOr<size_t> write_some(ReadonlyBytes) = 0; |
48 | | /// Same as write, but does not return until either the entire buffer |
49 | | /// contents are written or an error occurs. |
50 | | virtual ErrorOr<void> write_until_depleted(ReadonlyBytes); |
51 | | |
52 | | template<Concepts::AnyString T> |
53 | | ErrorOr<void> write_until_depleted(T const& buffer) |
54 | 1.51M | { |
55 | 1.51M | return write_until_depleted(StringView { buffer }.bytes()); |
56 | 1.51M | } _ZN2AK6Stream20write_until_depletedITkNS_8Concepts9AnyStringENS_4SpanIhEEEENS_7ErrorOrIvNS_5ErrorEEERKT_ Line | Count | Source | 54 | 1.48M | { | 55 | 1.48M | return write_until_depleted(StringView { buffer }.bytes()); | 56 | 1.48M | } |
_ZN2AK6Stream20write_until_depletedITkNS_8Concepts9AnyStringENS_6Detail10ByteBufferILm32EEEEENS_7ErrorOrIvNS_5ErrorEEERKT_ Line | Count | Source | 54 | 30.3k | { | 55 | 30.3k | return write_until_depleted(StringView { buffer }.bytes()); | 56 | 30.3k | } |
Unexecuted instantiation: _ZN2AK6Stream20write_until_depletedITkNS_8Concepts9AnyStringENS_10ByteStringEEENS_7ErrorOrIvNS_5ErrorEEERKT_ Unexecuted instantiation: _ZN2AK6Stream20write_until_depletedITkNS_8Concepts9AnyStringENS_10StringViewEEENS_7ErrorOrIvNS_5ErrorEEERKT_ Unexecuted instantiation: _ZN2AK6Stream20write_until_depletedITkNS_8Concepts9AnyStringENS_5ArrayIhLm4EEEEENS_7ErrorOrIvNS_5ErrorEEERKT_ Unexecuted instantiation: _ZN2AK6Stream20write_until_depletedITkNS_8Concepts9AnyStringENS_5ArrayIhLm8EEEEENS_7ErrorOrIvNS_5ErrorEEERKT_ |
57 | | |
58 | | template<typename T> |
59 | | requires(requires(Stream& stream) { { T::read_from_stream(stream) } -> SameAs<ErrorOr<T>>; }) |
60 | | ErrorOr<T> read_value() |
61 | 37.7M | { |
62 | 37.7M | return T::read_from_stream(*this); |
63 | 37.7M | } _ZN2AK6Stream10read_valueINS_6LEB128IjEEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS5_NS_5ErrorEEEEEEEESA_v Line | Count | Source | 61 | 35.2M | { | 62 | 35.2M | return T::read_from_stream(*this); | 63 | 35.2M | } |
_ZN2AK6Stream10read_valueIN4RIFF6Detail10FileHeaderINS3_11ChunkHeaderINS_12LittleEndianIjEEEEEEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrISB_NS_5ErrorEEEEEEEESG_v Line | Count | Source | 61 | 4.36k | { | 62 | 4.36k | return T::read_from_stream(*this); | 63 | 4.36k | } |
_ZN2AK6Stream10read_valueIN4RIFF6Detail11ChunkHeaderINS_9BigEndianIjEEEEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS9_NS_5ErrorEEEEEEEESE_v Line | Count | Source | 61 | 56 | { | 62 | 56 | return T::read_from_stream(*this); | 63 | 56 | } |
_ZN2AK6Stream10read_valueIN4RIFF6Detail11ChunkHeaderINS_12LittleEndianIjEEEEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS9_NS_5ErrorEEEEEEEESE_v Line | Count | Source | 61 | 603k | { | 62 | 603k | return T::read_from_stream(*this); | 63 | 603k | } |
_ZN2AK6Stream10read_valueIN4RIFF7ChunkIDEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS5_NS_5ErrorEEEEEEEESA_v Line | Count | Source | 61 | 831k | { | 62 | 831k | return T::read_from_stream(*this); | 63 | 831k | } |
_ZN2AK6Stream10read_valueIN4RIFF6Detail10OwnedChunkINS3_11ChunkHeaderINS_12LittleEndianIjEEEEEEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrISB_NS_5ErrorEEEEEEEESG_v Line | Count | Source | 61 | 599k | { | 62 | 599k | return T::read_from_stream(*this); | 63 | 599k | } |
_ZN2AK6Stream10read_valueINS_6LEB128IiEEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS5_NS_5ErrorEEEEEEEESA_v Line | Count | Source | 61 | 153k | { | 62 | 153k | return T::read_from_stream(*this); | 63 | 153k | } |
_ZN2AK6Stream10read_valueINS_6LEB128IlEEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS5_NS_5ErrorEEEEEEEESA_v Line | Count | Source | 61 | 3.44k | { | 62 | 3.44k | return T::read_from_stream(*this); | 63 | 3.44k | } |
_ZN2AK6Stream10read_valueIN5Audio3QOA11FrameHeaderEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS6_NS_5ErrorEEEEEEEESB_v Line | Count | Source | 61 | 254k | { | 62 | 254k | return T::read_from_stream(*this); | 63 | 254k | } |
_ZN2AK6Stream10read_valueIN4RIFF9OwnedListEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS5_NS_5ErrorEEEEEEEESA_v Line | Count | Source | 61 | 64.6k | { | 62 | 64.6k | return T::read_from_stream(*this); | 63 | 64.6k | } |
|
64 | | |
65 | | template<typename T> |
66 | | requires(Traits<T>::is_trivially_serializable()) |
67 | | ErrorOr<T> read_value() |
68 | 772M | { |
69 | 772M | alignas(T) u8 buffer[sizeof(T)] = {}; |
70 | 772M | TRY(read_until_filled({ &buffer, sizeof(buffer) })); |
71 | 772M | return bit_cast<T>(buffer); |
72 | 772M | } Unexecuted instantiation: AK::ErrorOr<unsigned long, AK::Error> AK::Stream::read_value<unsigned long>() requires Traits<unsigned long>::is_trivially_serializable() AK::ErrorOr<unsigned int, AK::Error> AK::Stream::read_value<unsigned int>() requires Traits<unsigned int>::is_trivially_serializable() Line | Count | Source | 68 | 3.69k | { | 69 | 3.69k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 3.69k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 3.67k | return bit_cast<T>(buffer); | 72 | 3.69k | } |
Unexecuted instantiation: AK::ErrorOr<Gfx::BitmapFormat, AK::Error> AK::Stream::read_value<Gfx::BitmapFormat>() requires Traits<Gfx::BitmapFormat>::is_trivially_serializable() Unexecuted instantiation: AK::ErrorOr<int, AK::Error> AK::Stream::read_value<int>() requires Traits<int>::is_trivially_serializable() AK::ErrorOr<unsigned char, AK::Error> AK::Stream::read_value<unsigned char>() requires Traits<unsigned char>::is_trivially_serializable() Line | Count | Source | 68 | 179M | { | 69 | 179M | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 179M | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 179M | return bit_cast<T>(buffer); | 72 | 179M | } |
AK::ErrorOr<Gfx::DDSHeader, AK::Error> AK::Stream::read_value<Gfx::DDSHeader>() requires Traits<Gfx::DDSHeader>::is_trivially_serializable() Line | Count | Source | 68 | 3.42k | { | 69 | 3.42k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 3.42k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 3.42k | return bit_cast<T>(buffer); | 72 | 3.42k | } |
AK::ErrorOr<Gfx::DDSHeaderDXT10, AK::Error> AK::Stream::read_value<Gfx::DDSHeaderDXT10>() requires Traits<Gfx::DDSHeaderDXT10>::is_trivially_serializable() Line | Count | Source | 68 | 31 | { | 69 | 31 | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 31 | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 31 | return bit_cast<T>(buffer); | 72 | 31 | } |
AK::ErrorOr<AK::LittleEndian<unsigned char>, AK::Error> AK::Stream::read_value<AK::LittleEndian<unsigned char> >() requires Traits<AK::LittleEndian<unsigned char> >::is_trivially_serializable() Line | Count | Source | 68 | 4.63M | { | 69 | 4.63M | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 4.63M | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 4.63M | return bit_cast<T>(buffer); | 72 | 4.63M | } |
AK::ErrorOr<unsigned short, AK::Error> AK::Stream::read_value<unsigned short>() requires Traits<unsigned short>::is_trivially_serializable() Line | Count | Source | 68 | 22.6k | { | 69 | 22.6k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 22.6k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 22.6k | return bit_cast<T>(buffer); | 72 | 22.6k | } |
AK::ErrorOr<AK::LittleEndian<unsigned short>, AK::Error> AK::Stream::read_value<AK::LittleEndian<unsigned short> >() requires Traits<AK::LittleEndian<unsigned short> >::is_trivially_serializable() Line | Count | Source | 68 | 296M | { | 69 | 296M | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 296M | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 296M | return bit_cast<T>(buffer); | 72 | 296M | } |
AK::ErrorOr<Gfx::ICONDIR, AK::Error> AK::Stream::read_value<Gfx::ICONDIR>() requires Traits<Gfx::ICONDIR>::is_trivially_serializable() Line | Count | Source | 68 | 5.87k | { | 69 | 5.87k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 5.87k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 5.87k | return bit_cast<T>(buffer); | 72 | 5.87k | } |
AK::ErrorOr<Gfx::ICONDIRENTRY, AK::Error> AK::Stream::read_value<Gfx::ICONDIRENTRY>() requires Traits<Gfx::ICONDIRENTRY>::is_trivially_serializable() Line | Count | Source | 68 | 252k | { | 69 | 252k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 252k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 252k | return bit_cast<T>(buffer); | 72 | 252k | } |
AK::ErrorOr<AK::BigEndian<unsigned int>, AK::Error> AK::Stream::read_value<AK::BigEndian<unsigned int> >() requires Traits<AK::BigEndian<unsigned int> >::is_trivially_serializable() Line | Count | Source | 68 | 8.79M | { | 69 | 8.79M | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 8.79M | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 8.79M | return bit_cast<T>(buffer); | 72 | 8.79M | } |
AK::ErrorOr<AK::BigEndian<unsigned short>, AK::Error> AK::Stream::read_value<AK::BigEndian<unsigned short> >() requires Traits<AK::BigEndian<unsigned short> >::is_trivially_serializable() Line | Count | Source | 68 | 18.9M | { | 69 | 18.9M | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 18.9M | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 18.9M | return bit_cast<T>(buffer); | 72 | 18.9M | } |
AK::ErrorOr<signed char, AK::Error> AK::Stream::read_value<signed char>() requires Traits<signed char>::is_trivially_serializable() Line | Count | Source | 68 | 27.0M | { | 69 | 27.0M | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 27.0M | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 27.0M | return bit_cast<T>(buffer); | 72 | 27.0M | } |
AK::ErrorOr<AK::BigEndian<int>, AK::Error> AK::Stream::read_value<AK::BigEndian<int> >() requires Traits<AK::BigEndian<int> >::is_trivially_serializable() Line | Count | Source | 68 | 2.52M | { | 69 | 2.52M | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 2.52M | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 2.52M | return bit_cast<T>(buffer); | 72 | 2.52M | } |
Unexecuted instantiation: AK::ErrorOr<AK::BigEndian<unsigned char>, AK::Error> AK::Stream::read_value<AK::BigEndian<unsigned char> >() requires Traits<AK::BigEndian<unsigned char> >::is_trivially_serializable() AK::ErrorOr<AK::BigEndian<Gfx::ISOBMFF::BoxType>, AK::Error> AK::Stream::read_value<AK::BigEndian<Gfx::ISOBMFF::BoxType> >() requires Traits<AK::BigEndian<Gfx::ISOBMFF::BoxType> >::is_trivially_serializable() Line | Count | Source | 68 | 26.0k | { | 69 | 26.0k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 26.0k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 26.0k | return bit_cast<T>(buffer); | 72 | 26.0k | } |
AK::ErrorOr<AK::BigEndian<unsigned long>, AK::Error> AK::Stream::read_value<AK::BigEndian<unsigned long> >() requires Traits<AK::BigEndian<unsigned long> >::is_trivially_serializable() Line | Count | Source | 68 | 1.20M | { | 69 | 1.20M | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 1.20M | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 1.20M | return bit_cast<T>(buffer); | 72 | 1.20M | } |
AK::ErrorOr<AK::BigEndian<Gfx::ISOBMFF::BrandIdentifier>, AK::Error> AK::Stream::read_value<AK::BigEndian<Gfx::ISOBMFF::BrandIdentifier> >() requires Traits<AK::BigEndian<Gfx::ISOBMFF::BrandIdentifier> >::is_trivially_serializable() Line | Count | Source | 68 | 471k | { | 69 | 471k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 471k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 471k | return bit_cast<T>(buffer); | 72 | 471k | } |
AK::ErrorOr<Gfx::QOIHeader, AK::Error> AK::Stream::read_value<Gfx::QOIHeader>() requires Traits<Gfx::QOIHeader>::is_trivially_serializable() Line | Count | Source | 68 | 386 | { | 69 | 386 | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 386 | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 382 | return bit_cast<T>(buffer); | 72 | 386 | } |
AK::ErrorOr<Gfx::TGAHeader, AK::Error> AK::Stream::read_value<Gfx::TGAHeader>() requires Traits<Gfx::TGAHeader>::is_trivially_serializable() Line | Count | Source | 68 | 501 | { | 69 | 501 | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 501 | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 496 | return bit_cast<T>(buffer); | 72 | 501 | } |
AK::ErrorOr<AK::LittleEndian<unsigned int>, AK::Error> AK::Stream::read_value<AK::LittleEndian<unsigned int> >() requires Traits<AK::LittleEndian<unsigned int> >::is_trivially_serializable() Line | Count | Source | 68 | 168M | { | 69 | 168M | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 168M | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 168M | return bit_cast<T>(buffer); | 72 | 168M | } |
AK::ErrorOr<AK::LittleEndian<int>, AK::Error> AK::Stream::read_value<AK::LittleEndian<int> >() requires Traits<AK::LittleEndian<int> >::is_trivially_serializable() Line | Count | Source | 68 | 16.0M | { | 69 | 16.0M | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 16.0M | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 16.0M | return bit_cast<T>(buffer); | 72 | 16.0M | } |
AK::ErrorOr<AK::LittleEndian<float>, AK::Error> AK::Stream::read_value<AK::LittleEndian<float> >() requires Traits<AK::LittleEndian<float> >::is_trivially_serializable() Line | Count | Source | 68 | 15.8M | { | 69 | 15.8M | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 15.8M | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 15.8M | return bit_cast<T>(buffer); | 72 | 15.8M | } |
AK::ErrorOr<AK::BigEndian<float>, AK::Error> AK::Stream::read_value<AK::BigEndian<float> >() requires Traits<AK::BigEndian<float> >::is_trivially_serializable() Line | Count | Source | 68 | 495k | { | 69 | 495k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 495k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 495k | return bit_cast<T>(buffer); | 72 | 495k | } |
AK::ErrorOr<AK::LittleEndian<double>, AK::Error> AK::Stream::read_value<AK::LittleEndian<double> >() requires Traits<AK::LittleEndian<double> >::is_trivially_serializable() Line | Count | Source | 68 | 2.28M | { | 69 | 2.28M | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 2.28M | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 2.28M | return bit_cast<T>(buffer); | 72 | 2.28M | } |
AK::ErrorOr<AK::BigEndian<double>, AK::Error> AK::Stream::read_value<AK::BigEndian<double> >() requires Traits<AK::BigEndian<double> >::is_trivially_serializable() Line | Count | Source | 68 | 268k | { | 69 | 268k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 268k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 268k | return bit_cast<T>(buffer); | 72 | 268k | } |
AK::ErrorOr<AK::LittleEndian<short>, AK::Error> AK::Stream::read_value<AK::LittleEndian<short> >() requires Traits<AK::LittleEndian<short> >::is_trivially_serializable() Line | Count | Source | 68 | 108k | { | 69 | 108k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 108k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 108k | return bit_cast<T>(buffer); | 72 | 108k | } |
AK::ErrorOr<Gfx::FourCC, AK::Error> AK::Stream::read_value<Gfx::FourCC>() requires Traits<Gfx::FourCC>::is_trivially_serializable() Line | Count | Source | 68 | 7.28k | { | 69 | 7.28k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 7.28k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 7.28k | return bit_cast<T>(buffer); | 72 | 7.28k | } |
AK::ErrorOr<AK::BigEndian<short>, AK::Error> AK::Stream::read_value<AK::BigEndian<short> >() requires Traits<AK::BigEndian<short> >::is_trivially_serializable() Line | Count | Source | 68 | 100k | { | 69 | 100k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 100k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 100k | return bit_cast<T>(buffer); | 72 | 100k | } |
AK::ErrorOr<WOFF::Header, AK::Error> AK::Stream::read_value<WOFF::Header>() requires Traits<WOFF::Header>::is_trivially_serializable() Line | Count | Source | 68 | 2.10k | { | 69 | 2.10k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 2.10k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 2.09k | return bit_cast<T>(buffer); | 72 | 2.10k | } |
AK::ErrorOr<WOFF::TableDirectoryEntry, AK::Error> AK::Stream::read_value<WOFF::TableDirectoryEntry>() requires Traits<WOFF::TableDirectoryEntry>::is_trivially_serializable() Line | Count | Source | 68 | 8.67k | { | 69 | 8.67k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 8.67k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 8.67k | return bit_cast<T>(buffer); | 72 | 8.67k | } |
Unexecuted instantiation: AK::ErrorOr<bool, AK::Error> AK::Stream::read_value<bool>() requires Traits<bool>::is_trivially_serializable() AK::ErrorOr<Compress::ZlibHeader, AK::Error> AK::Stream::read_value<Compress::ZlibHeader>() requires Traits<Compress::ZlibHeader>::is_trivially_serializable() Line | Count | Source | 68 | 9.14k | { | 69 | 9.14k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 9.14k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 9.08k | return bit_cast<T>(buffer); | 72 | 9.14k | } |
Unexecuted instantiation: AK::ErrorOr<long, AK::Error> AK::Stream::read_value<long>() requires Traits<long>::is_trivially_serializable() AK::ErrorOr<AK::LittleEndian<unsigned long>, AK::Error> AK::Stream::read_value<AK::LittleEndian<unsigned long> >() requires Traits<AK::LittleEndian<unsigned long> >::is_trivially_serializable() Line | Count | Source | 68 | 1.87k | { | 69 | 1.87k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 1.87k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 1.87k | return bit_cast<T>(buffer); | 72 | 1.87k | } |
AK::ErrorOr<AK::LittleEndian<AK::Detail::UFixedBigInt<128ul, AK::Detail::StaticStorage<false, 128ul> > >, AK::Error> AK::Stream::read_value<AK::LittleEndian<AK::Detail::UFixedBigInt<128ul, AK::Detail::StaticStorage<false, 128ul> > > >() requires Traits<AK::LittleEndian<AK::Detail::UFixedBigInt<128ul, AK::Detail::StaticStorage<false, 128ul> > > >::is_trivially_serializable() Line | Count | Source | 68 | 360 | { | 69 | 360 | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 360 | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 357 | return bit_cast<T>(buffer); | 72 | 360 | } |
AK::ErrorOr<Archive::TarFileHeader, AK::Error> AK::Stream::read_value<Archive::TarFileHeader>() requires Traits<Archive::TarFileHeader>::is_trivially_serializable() Line | Count | Source | 68 | 8.11k | { | 69 | 8.11k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 8.11k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 8.06k | return bit_cast<T>(buffer); | 72 | 8.11k | } |
AK::ErrorOr<Compress::LzmaHeader, AK::Error> AK::Stream::read_value<Compress::LzmaHeader>() requires Traits<Compress::LzmaHeader>::is_trivially_serializable() Line | Count | Source | 68 | 4.41k | { | 69 | 4.41k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 4.41k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 4.40k | return bit_cast<T>(buffer); | 72 | 4.41k | } |
AK::ErrorOr<char, AK::Error> AK::Stream::read_value<char>() requires Traits<char>::is_trivially_serializable() Line | Count | Source | 68 | 4.10M | { | 69 | 4.10M | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 4.10M | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 4.10M | return bit_cast<T>(buffer); | 72 | 4.10M | } |
AK::ErrorOr<WOFF2::TransformedGlyfTable, AK::Error> AK::Stream::read_value<WOFF2::TransformedGlyfTable>() requires Traits<WOFF2::TransformedGlyfTable>::is_trivially_serializable() Line | Count | Source | 68 | 1.10k | { | 69 | 1.10k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 1.10k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 1.10k | return bit_cast<T>(buffer); | 72 | 1.10k | } |
AK::ErrorOr<WOFF2::Header, AK::Error> AK::Stream::read_value<WOFF2::Header>() requires Traits<WOFF2::Header>::is_trivially_serializable() Line | Count | Source | 68 | 3.97k | { | 69 | 3.97k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 3.97k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 3.97k | return bit_cast<T>(buffer); | 72 | 3.97k | } |
Unexecuted instantiation: AK::ErrorOr<AK::BigEndian<AK::Detail::UFixedBigInt<256ul, AK::Detail::StaticStorage<false, 256ul> > >, AK::Error> AK::Stream::read_value<AK::BigEndian<AK::Detail::UFixedBigInt<256ul, AK::Detail::StaticStorage<false, 256ul> > > >() requires Traits<AK::BigEndian<AK::Detail::UFixedBigInt<256ul, AK::Detail::StaticStorage<false, 256ul> > > >::is_trivially_serializable() Unexecuted instantiation: AK::ErrorOr<AK::BigEndian<AK::Detail::UFixedBigInt<384ul, AK::Detail::StaticStorage<false, 384ul> > >, AK::Error> AK::Stream::read_value<AK::BigEndian<AK::Detail::UFixedBigInt<384ul, AK::Detail::StaticStorage<false, 384ul> > > >() requires Traits<AK::BigEndian<AK::Detail::UFixedBigInt<384ul, AK::Detail::StaticStorage<false, 384ul> > > >::is_trivially_serializable() Unexecuted instantiation: AK::ErrorOr<AK::LittleEndian<long>, AK::Error> AK::Stream::read_value<AK::LittleEndian<long> >() requires Traits<AK::LittleEndian<long> >::is_trivially_serializable() AK::ErrorOr<AK::LittleEndian<signed char>, AK::Error> AK::Stream::read_value<AK::LittleEndian<signed char> >() requires Traits<AK::LittleEndian<signed char> >::is_trivially_serializable() Line | Count | Source | 68 | 34.9k | { | 69 | 34.9k | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 34.9k | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 34.9k | return bit_cast<T>(buffer); | 72 | 34.9k | } |
Unexecuted instantiation: AK::ErrorOr<short, AK::Error> AK::Stream::read_value<short>() requires Traits<short>::is_trivially_serializable() Unexecuted instantiation: AK::ErrorOr<double, AK::Error> AK::Stream::read_value<double>() requires Traits<double>::is_trivially_serializable() AK::ErrorOr<HID::ItemHeader, AK::Error> AK::Stream::read_value<HID::ItemHeader>() requires Traits<HID::ItemHeader>::is_trivially_serializable() Line | Count | Source | 68 | 24.5M | { | 69 | 24.5M | alignas(T) u8 buffer[sizeof(T)] = {}; | 70 | 24.5M | TRY(read_until_filled({ &buffer, sizeof(buffer) })); | 71 | 24.5M | return bit_cast<T>(buffer); | 72 | 24.5M | } |
|
73 | | |
74 | | template<typename T> |
75 | | requires(requires(T t, Stream& stream) { { t.write_to_stream(stream) } -> SameAs<ErrorOr<void>>; }) |
76 | | ErrorOr<void> write_value(T const& value) |
77 | 1.48M | { |
78 | 1.48M | return value.write_to_stream(*this); |
79 | 1.48M | } |
80 | | |
81 | | template<typename T> |
82 | | requires(Traits<T>::is_trivially_serializable()) |
83 | | ErrorOr<void> write_value(T const& value) |
84 | 46.5M | { |
85 | 46.5M | return write_until_depleted({ &value, sizeof(value) }); |
86 | 46.5M | } Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_value<unsigned long>(unsigned long const&) requires Traits<unsigned long>::is_trivially_serializable() AK::ErrorOr<void, AK::Error> AK::Stream::write_value<unsigned int>(unsigned int const&) requires Traits<unsigned int>::is_trivially_serializable() Line | Count | Source | 84 | 337k | { | 85 | 337k | return write_until_depleted({ &value, sizeof(value) }); | 86 | 337k | } |
Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_value<Gfx::BitmapFormat>(Gfx::BitmapFormat const&) requires Traits<Gfx::BitmapFormat>::is_trivially_serializable() AK::ErrorOr<void, AK::Error> AK::Stream::write_value<unsigned char>(unsigned char const&) requires Traits<unsigned char>::is_trivially_serializable() Line | Count | Source | 84 | 41.3M | { | 85 | 41.3M | return write_until_depleted({ &value, sizeof(value) }); | 86 | 41.3M | } |
AK::ErrorOr<void, AK::Error> AK::Stream::write_value<AK::LittleEndian<unsigned short> >(AK::LittleEndian<unsigned short> const&) requires Traits<AK::LittleEndian<unsigned short> >::is_trivially_serializable() Line | Count | Source | 84 | 8.41k | { | 85 | 8.41k | return write_until_depleted({ &value, sizeof(value) }); | 86 | 8.41k | } |
Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_value<AK::BigEndian<unsigned short> >(AK::BigEndian<unsigned short> const&) requires Traits<AK::BigEndian<unsigned short> >::is_trivially_serializable() Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_value<AK::BigEndian<unsigned int> >(AK::BigEndian<unsigned int> const&) requires Traits<AK::BigEndian<unsigned int> >::is_trivially_serializable() AK::ErrorOr<void, AK::Error> AK::Stream::write_value<Compress::LzmaHeader>(Compress::LzmaHeader const&) requires Traits<Compress::LzmaHeader>::is_trivially_serializable() Line | Count | Source | 84 | 2.72k | { | 85 | 2.72k | return write_until_depleted({ &value, sizeof(value) }); | 86 | 2.72k | } |
AK::ErrorOr<void, AK::Error> AK::Stream::write_value<AK::LittleEndian<unsigned int> >(AK::LittleEndian<unsigned int> const&) requires Traits<AK::LittleEndian<unsigned int> >::is_trivially_serializable() Line | Count | Source | 84 | 4.56k | { | 85 | 4.56k | return write_until_depleted({ &value, sizeof(value) }); | 86 | 4.56k | } |
AK::ErrorOr<void, AK::Error> AK::Stream::write_value<DNS::PacketHeader>(DNS::PacketHeader const&) requires Traits<DNS::PacketHeader>::is_trivially_serializable() Line | Count | Source | 84 | 446 | { | 85 | 446 | return write_until_depleted({ &value, sizeof(value) }); | 86 | 446 | } |
AK::ErrorOr<void, AK::Error> AK::Stream::write_value<unsigned short>(unsigned short const&) requires Traits<unsigned short>::is_trivially_serializable() Line | Count | Source | 84 | 3.31M | { | 85 | 3.31M | return write_until_depleted({ &value, sizeof(value) }); | 86 | 3.31M | } |
AK::ErrorOr<void, AK::Error> AK::Stream::write_value<char>(char const&) requires Traits<char>::is_trivially_serializable() Line | Count | Source | 84 | 1.48M | { | 85 | 1.48M | return write_until_depleted({ &value, sizeof(value) }); | 86 | 1.48M | } |
Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_value<AK::BigEndian<AK::Detail::UFixedBigInt<256ul, AK::Detail::StaticStorage<false, 256ul> > > >(AK::BigEndian<AK::Detail::UFixedBigInt<256ul, AK::Detail::StaticStorage<false, 256ul> > > const&) requires Traits<AK::BigEndian<AK::Detail::UFixedBigInt<256ul, AK::Detail::StaticStorage<false, 256ul> > > >::is_trivially_serializable() Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_value<AK::BigEndian<AK::Detail::UFixedBigInt<384ul, AK::Detail::StaticStorage<false, 384ul> > > >(AK::BigEndian<AK::Detail::UFixedBigInt<384ul, AK::Detail::StaticStorage<false, 384ul> > > const&) requires Traits<AK::BigEndian<AK::Detail::UFixedBigInt<384ul, AK::Detail::StaticStorage<false, 384ul> > > >::is_trivially_serializable() |
87 | | |
88 | | template<typename... Parameters> |
89 | | ErrorOr<void> write_formatted(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters) |
90 | 0 | { |
91 | 0 | VariadicFormatParams<AllowDebugOnlyFormatters::No, Parameters...> variadic_format_params { parameters... }; |
92 | 0 | TRY(write_formatted_impl(fmtstr.view(), variadic_format_params)); |
93 | 0 | return {}; |
94 | 0 | } Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<>(AK::Format::Detail::CheckedFormatString<>&&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<JS::Object*>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<JS::Object*>::Type>&&, JS::Object* const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<AK::StringView>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<AK::StringView>::Type>&&, AK::StringView const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<AK::DeprecatedFlyString>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<AK::DeprecatedFlyString>::Type>&&, AK::DeprecatedFlyString const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<AK::ByteString>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<AK::ByteString>::Type>&&, AK::ByteString const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<AK::ByteString, AK::ByteString>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<AK::ByteString>::Type, AK::Detail::__IdentityType<AK::ByteString>::Type>&&, AK::ByteString const&, AK::ByteString const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<unsigned long>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<unsigned long>::Type>&&, unsigned long const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<JS::ArrayBuffer*>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<JS::ArrayBuffer*>::Type>&&, JS::ArrayBuffer* const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<unsigned char>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<unsigned char>::Type>&&, unsigned char const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<unsigned short>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<unsigned short>::Type>&&, unsigned short const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<unsigned int>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<unsigned int>::Type>&&, unsigned int const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<signed char>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<signed char>::Type>&&, signed char const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<short>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<short>::Type>&&, short const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<int>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<int>::Type>&&, int const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<long>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<long>::Type>&&, long const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<float>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<float>::Type>&&, float const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<double>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<double>::Type>&&, double const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<double, double, double, double, double, double, double, double, double, double>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<double>::Type, AK::Detail::__IdentityType<double>::Type, AK::Detail::__IdentityType<double>::Type, AK::Detail::__IdentityType<double>::Type, AK::Detail::__IdentityType<double>::Type, AK::Detail::__IdentityType<double>::Type, AK::Detail::__IdentityType<double>::Type, AK::Detail::__IdentityType<double>::Type, AK::Detail::__IdentityType<double>::Type, AK::Detail::__IdentityType<double>::Type>&&, double const&, double const&, double const&, double const&, double const&, double const&, double const&, double const&, double const&, double const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<int, unsigned char, unsigned char>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<int>::Type, AK::Detail::__IdentityType<unsigned char>::Type, AK::Detail::__IdentityType<unsigned char>::Type>&&, int const&, unsigned char const&, unsigned char const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<int, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned short, unsigned short, unsigned short>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<int>::Type, AK::Detail::__IdentityType<unsigned char>::Type, AK::Detail::__IdentityType<unsigned char>::Type, AK::Detail::__IdentityType<unsigned char>::Type, AK::Detail::__IdentityType<unsigned char>::Type, AK::Detail::__IdentityType<unsigned char>::Type, AK::Detail::__IdentityType<unsigned short>::Type, AK::Detail::__IdentityType<unsigned short>::Type, AK::Detail::__IdentityType<unsigned short>::Type>&&, int const&, unsigned char const&, unsigned char const&, unsigned char const&, unsigned char const&, unsigned char const&, unsigned short const&, unsigned short const&, unsigned short const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<unsigned char, unsigned char>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<unsigned char>::Type, AK::Detail::__IdentityType<unsigned char>::Type>&&, unsigned char const&, unsigned char const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<unsigned char, unsigned char, unsigned char, unsigned short, unsigned short, unsigned short>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<unsigned char>::Type, AK::Detail::__IdentityType<unsigned char>::Type, AK::Detail::__IdentityType<unsigned char>::Type, AK::Detail::__IdentityType<unsigned short>::Type, AK::Detail::__IdentityType<unsigned short>::Type, AK::Detail::__IdentityType<unsigned short>::Type>&&, unsigned char const&, unsigned char const&, unsigned char const&, unsigned short const&, unsigned short const&, unsigned short const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<int, unsigned char>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<int>::Type, AK::Detail::__IdentityType<unsigned char>::Type>&&, int const&, unsigned char const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<JS::PropertyKey>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<JS::PropertyKey>::Type>&&, JS::PropertyKey const&) Unexecuted instantiation: AK::ErrorOr<void, AK::Error> AK::Stream::write_formatted<AK::String>(AK::Format::Detail::CheckedFormatString<AK::Detail::__IdentityType<AK::String>::Type>&&, AK::String const&) |
95 | | |
96 | | /// Returns whether the stream has reached the end of file. For sockets, |
97 | | /// this most likely means that the protocol has disconnected (in the case |
98 | | /// of TCP). For seekable streams, this means the end of the file. Note that |
99 | | /// is_eof will only return true _after_ a read with 0 length, so this |
100 | | /// method should be called after a read. |
101 | | virtual bool is_eof() const = 0; |
102 | | |
103 | | virtual bool is_open() const = 0; |
104 | | virtual void close() = 0; |
105 | | |
106 | | virtual ~Stream() |
107 | 8.07M | { |
108 | 8.07M | } |
109 | | |
110 | | protected: |
111 | | /// Provides a default implementation of read_until_eof that works for streams |
112 | | /// that behave like POSIX file descriptors. expected_file_size can be |
113 | | /// passed as a heuristic for what the Stream subclass expects the file |
114 | | /// content size to be in order to reduce allocations (does not affect |
115 | | /// actual reading). |
116 | | ErrorOr<ByteBuffer> read_until_eof_impl(size_t block_size, size_t expected_file_size = 0); |
117 | | |
118 | | private: |
119 | | ErrorOr<void> write_formatted_impl(StringView, TypeErasedFormatParams&); |
120 | | }; |
121 | | |
122 | | enum class SeekMode { |
123 | | SetPosition, |
124 | | FromCurrentPosition, |
125 | | FromEndPosition, |
126 | | }; |
127 | | |
128 | | /// Adds seekability to a Stream. Classes inheriting from SeekableStream |
129 | | /// will be seekable to any point in the stream. |
130 | | class SeekableStream : public Stream { |
131 | | public: |
132 | | /// Seeks to the given position in the given mode. Returns either the |
133 | | /// current position of the file, or an errno in the case of an error. |
134 | | virtual ErrorOr<size_t> seek(i64 offset, SeekMode) = 0; |
135 | | /// Returns the current position of the file, or an errno in the case of |
136 | | /// an error. |
137 | | virtual ErrorOr<size_t> tell() const; |
138 | | /// Returns the total size of the stream, or an errno in the case of an |
139 | | /// error. May not preserve the original position on the stream on failure. |
140 | | virtual ErrorOr<size_t> size(); |
141 | | /// Shrinks or extends the stream to the given size. Returns an errno in |
142 | | /// the case of an error. |
143 | | virtual ErrorOr<void> truncate(size_t length) = 0; |
144 | | /// Seeks until after the given amount of bytes to be discarded instead of |
145 | | /// reading and discarding everything manually; |
146 | | virtual ErrorOr<void> discard(size_t discarded_bytes) override; |
147 | | }; |
148 | | |
149 | | } |
150 | | |
151 | | #if USING_AK_GLOBALLY |
152 | | using AK::SeekMode; |
153 | | #endif |