Coverage Report

Created: 2026-02-14 08:01

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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