Coverage Report

Created: 2025-03-04 07:22

/src/serenity/AK/Stream.h
Line
Count
Source (jump to first uncovered line)
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.70M
    {
55
1.70M
        return write_until_depleted(StringView { buffer }.bytes());
56
1.70M
    }
_ZN2AK6Stream20write_until_depletedITkNS_8Concepts9AnyStringENS_4SpanIhEEEENS_7ErrorOrIvNS_5ErrorEEERKT_
Line
Count
Source
54
1.67M
    {
55
1.67M
        return write_until_depleted(StringView { buffer }.bytes());
56
1.67M
    }
_ZN2AK6Stream20write_until_depletedITkNS_8Concepts9AnyStringENS_6Detail10ByteBufferILm32EEEEENS_7ErrorOrIvNS_5ErrorEEERKT_
Line
Count
Source
54
33.2k
    {
55
33.2k
        return write_until_depleted(StringView { buffer }.bytes());
56
33.2k
    }
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
38.7M
    {
62
38.7M
        return T::read_from_stream(*this);
63
38.7M
    }
_ZN2AK6Stream10read_valueINS_6LEB128IjEEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS5_NS_5ErrorEEEEEEEESA_v
Line
Count
Source
61
35.7M
    {
62
35.7M
        return T::read_from_stream(*this);
63
35.7M
    }
_ZN2AK6Stream10read_valueIN4RIFF6Detail10FileHeaderINS3_11ChunkHeaderINS_12LittleEndianIjEEEEEEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrISB_NS_5ErrorEEEEEEEESG_v
Line
Count
Source
61
4.44k
    {
62
4.44k
        return T::read_from_stream(*this);
63
4.44k
    }
_ZN2AK6Stream10read_valueIN4RIFF6Detail11ChunkHeaderINS_9BigEndianIjEEEEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS9_NS_5ErrorEEEEEEEESE_v
Line
Count
Source
61
473
    {
62
473
        return T::read_from_stream(*this);
63
473
    }
_ZN2AK6Stream10read_valueIN4RIFF6Detail11ChunkHeaderINS_12LittleEndianIjEEEEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS9_NS_5ErrorEEEEEEEESE_v
Line
Count
Source
61
710k
    {
62
710k
        return T::read_from_stream(*this);
63
710k
    }
_ZN2AK6Stream10read_valueIN4RIFF7ChunkIDEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS5_NS_5ErrorEEEEEEEESA_v
Line
Count
Source
61
1.03M
    {
62
1.03M
        return T::read_from_stream(*this);
63
1.03M
    }
_ZN2AK6Stream10read_valueIN4RIFF6Detail10OwnedChunkINS3_11ChunkHeaderINS_12LittleEndianIjEEEEEEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrISB_NS_5ErrorEEEEEEEESG_v
Line
Count
Source
61
706k
    {
62
706k
        return T::read_from_stream(*this);
63
706k
    }
_ZN2AK6Stream10read_valueINS_6LEB128IiEEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS5_NS_5ErrorEEEEEEEESA_v
Line
Count
Source
61
157k
    {
62
157k
        return T::read_from_stream(*this);
63
157k
    }
_ZN2AK6Stream10read_valueINS_6LEB128IlEEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS5_NS_5ErrorEEEEEEEESA_v
Line
Count
Source
61
30.9k
    {
62
30.9k
        return T::read_from_stream(*this);
63
30.9k
    }
_ZN2AK6Stream10read_valueIN5Audio3QOA11FrameHeaderEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS6_NS_5ErrorEEEEEEEESB_v
Line
Count
Source
61
246k
    {
62
246k
        return T::read_from_stream(*this);
63
246k
    }
_ZN2AK6Stream10read_valueIN4RIFF9OwnedListEQrQRS0__XclsrT_16read_from_streamfL0p_ERNS_8Concepts6SameAsINS_7ErrorOrIS5_NS_5ErrorEEEEEEEESA_v
Line
Count
Source
61
54.6k
    {
62
54.6k
        return T::read_from_stream(*this);
63
54.6k
    }
64
65
    template<typename T>
66
    requires(Traits<T>::is_trivially_serializable())
67
    ErrorOr<T> read_value()
68
529M
    {
69
529M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
529M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
529M
    }
Unexecuted instantiation: _ZN2AK6Stream10read_valueImQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS2_NS_5ErrorEEEv
_ZN2AK6Stream10read_valueIjQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS2_NS_5ErrorEEEv
Line
Count
Source
68
3.85k
    {
69
3.85k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
3.85k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
3.85k
    }
Unexecuted instantiation: _ZN2AK6Stream10read_valueIN3Gfx12BitmapFormatEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Unexecuted instantiation: _ZN2AK6Stream10read_valueIiQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS2_NS_5ErrorEEEv
_ZN2AK6Stream10read_valueIhQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS2_NS_5ErrorEEEv
Line
Count
Source
68
164M
    {
69
164M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
164M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
164M
    }
_ZN2AK6Stream10read_valueIN3Gfx9DDSHeaderEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
3.59k
    {
69
3.59k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
3.59k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
3.59k
    }
_ZN2AK6Stream10read_valueIN3Gfx14DDSHeaderDXT10EQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
26
    {
69
26
        alignas(T) u8 buffer[sizeof(T)] = {};
70
26
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
26
    }
_ZN2AK6Stream10read_valueINS_12LittleEndianIhEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
3.77M
    {
69
3.77M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
3.77M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
3.77M
    }
_ZN2AK6Stream10read_valueINS_12LittleEndianItEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
214M
    {
69
214M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
214M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
214M
    }
_ZN2AK6Stream10read_valueIN3Gfx7ICONDIREQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
5.74k
    {
69
5.74k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
5.74k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
5.74k
    }
_ZN2AK6Stream10read_valueIN3Gfx12ICONDIRENTRYEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
450k
    {
69
450k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
450k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
450k
    }
_ZN2AK6Stream10read_valueINS_9BigEndianIjEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
14.4M
    {
69
14.4M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
14.4M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
14.4M
    }
_ZN2AK6Stream10read_valueINS_9BigEndianItEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
13.1M
    {
69
13.1M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
13.1M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
13.1M
    }
_ZN2AK6Stream10read_valueIaQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS2_NS_5ErrorEEEv
Line
Count
Source
68
20.9M
    {
69
20.9M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
20.9M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
20.9M
    }
_ZN2AK6Stream10read_valueINS_9BigEndianIiEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
5.70M
    {
69
5.70M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
5.70M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
5.70M
    }
Unexecuted instantiation: _ZN2AK6Stream10read_valueINS_9BigEndianIhEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
_ZN2AK6Stream10read_valueINS_9BigEndianIN3Gfx7ISOBMFF7BoxTypeEEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS7_NS_5ErrorEEEv
Line
Count
Source
68
912k
    {
69
912k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
912k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
912k
    }
_ZN2AK6Stream10read_valueINS_9BigEndianImEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
1.43M
    {
69
1.43M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
1.43M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
1.43M
    }
_ZN2AK6Stream10read_valueINS_9BigEndianIN3Gfx7ISOBMFF15BrandIdentifierEEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS7_NS_5ErrorEEEv
Line
Count
Source
68
1.00M
    {
69
1.00M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
1.00M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
1.00M
    }
_ZN2AK6Stream10read_valueIN3Gfx9QOIHeaderEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
381
    {
69
381
        alignas(T) u8 buffer[sizeof(T)] = {};
70
381
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
381
    }
_ZN2AK6Stream10read_valueIN3Gfx9TGAHeaderEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
357
    {
69
357
        alignas(T) u8 buffer[sizeof(T)] = {};
70
357
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
357
    }
_ZN2AK6Stream10read_valueItQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS2_NS_5ErrorEEEv
Line
Count
Source
68
11.5k
    {
69
11.5k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
11.5k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
11.5k
    }
_ZN2AK6Stream10read_valueINS_12LittleEndianIjEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
44.3M
    {
69
44.3M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
44.3M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
44.3M
    }
_ZN2AK6Stream10read_valueINS_12LittleEndianIiEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
13.9M
    {
69
13.9M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
13.9M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
13.9M
    }
_ZN2AK6Stream10read_valueINS_12LittleEndianIfEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
2.71M
    {
69
2.71M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
2.71M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
2.71M
    }
_ZN2AK6Stream10read_valueINS_9BigEndianIfEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
90.3k
    {
69
90.3k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
90.3k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
90.3k
    }
_ZN2AK6Stream10read_valueINS_12LittleEndianIdEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
8.56M
    {
69
8.56M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
8.56M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
8.56M
    }
_ZN2AK6Stream10read_valueINS_9BigEndianIdEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
441k
    {
69
441k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
441k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
441k
    }
_ZN2AK6Stream10read_valueINS_12LittleEndianIsEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
319k
    {
69
319k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
319k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
319k
    }
_ZN2AK6Stream10read_valueIN3Gfx6FourCCEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
7.44k
    {
69
7.44k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
7.44k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
7.44k
    }
_ZN2AK6Stream10read_valueINS_9BigEndianIsEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
95.1k
    {
69
95.1k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
95.1k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
95.1k
    }
_ZN2AK6Stream10read_valueIN4WOFF6HeaderEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
1.89k
    {
69
1.89k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
1.89k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
1.89k
    }
_ZN2AK6Stream10read_valueIN4WOFF19TableDirectoryEntryEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
8.41k
    {
69
8.41k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
8.41k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
8.41k
    }
Unexecuted instantiation: _ZN2AK6Stream10read_valueIbQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS2_NS_5ErrorEEEv
_ZN2AK6Stream10read_valueIN8Compress10ZlibHeaderEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
9.12k
    {
69
9.12k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
9.12k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
9.12k
    }
Unexecuted instantiation: _ZN2AK6Stream10read_valueIlQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS2_NS_5ErrorEEEv
_ZN2AK6Stream10read_valueINS_12LittleEndianImEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
2.58k
    {
69
2.58k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
2.58k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
2.58k
    }
_ZN2AK6Stream10read_valueINS_12LittleEndianINS_6Detail12UFixedBigIntILm128ENS3_13StaticStorageILb0ELm128EEEEEEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS9_NS_5ErrorEEEv
Line
Count
Source
68
410
    {
69
410
        alignas(T) u8 buffer[sizeof(T)] = {};
70
410
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
410
    }
_ZN2AK6Stream10read_valueIN7Archive13TarFileHeaderEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
9.40k
    {
69
9.40k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
9.40k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
9.40k
    }
_ZN2AK6Stream10read_valueIN8Compress10LzmaHeaderEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
3.35k
    {
69
3.35k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
3.35k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
3.35k
    }
_ZN2AK6Stream10read_valueIcQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS2_NS_5ErrorEEEv
Line
Count
Source
68
5.13M
    {
69
5.13M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
5.13M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
5.13M
    }
_ZN2AK6Stream10read_valueIN5WOFF220TransformedGlyfTableEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
976
    {
69
976
        alignas(T) u8 buffer[sizeof(T)] = {};
70
976
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
976
    }
_ZN2AK6Stream10read_valueIN5WOFF26HeaderEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
3.86k
    {
69
3.86k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
3.86k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
3.86k
    }
Unexecuted instantiation: _ZN2AK6Stream10read_valueINS_9BigEndianINS_6Detail12UFixedBigIntILm256ENS3_13StaticStorageILb0ELm256EEEEEEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS9_NS_5ErrorEEEv
Unexecuted instantiation: _ZN2AK6Stream10read_valueINS_9BigEndianINS_6Detail12UFixedBigIntILm384ENS3_13StaticStorageILb0ELm384EEEEEEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS9_NS_5ErrorEEEv
Unexecuted instantiation: _ZN2AK6Stream10read_valueINS_12LittleEndianIlEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
_ZN2AK6Stream10read_valueINS_12LittleEndianIaEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
7.72k
    {
69
7.72k
        alignas(T) u8 buffer[sizeof(T)] = {};
70
7.72k
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
7.72k
    }
Unexecuted instantiation: _ZN2AK6Stream10read_valueIsQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS2_NS_5ErrorEEEv
Unexecuted instantiation: _ZN2AK6Stream10read_valueIdQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS2_NS_5ErrorEEEv
_ZN2AK6Stream10read_valueIN3HID10ItemHeaderEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIS4_NS_5ErrorEEEv
Line
Count
Source
68
13.4M
    {
69
13.4M
        alignas(T) u8 buffer[sizeof(T)] = {};
70
13.4M
        TRY(read_until_filled({ &buffer, sizeof(buffer) }));
71
0
        return bit_cast<T>(buffer);
72
13.4M
    }
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.72M
    {
78
1.72M
        return value.write_to_stream(*this);
79
1.72M
    }
80
81
    template<typename T>
82
    requires(Traits<T>::is_trivially_serializable())
83
    ErrorOr<void> write_value(T const& value)
84
84.9M
    {
85
84.9M
        return write_until_depleted({ &value, sizeof(value) });
86
84.9M
    }
Unexecuted instantiation: _ZN2AK6Stream11write_valueImQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIvNS_5ErrorEEERKS2_
_ZN2AK6Stream11write_valueIjQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIvNS_5ErrorEEERKS2_
Line
Count
Source
84
262k
    {
85
262k
        return write_until_depleted({ &value, sizeof(value) });
86
262k
    }
Unexecuted instantiation: _ZN2AK6Stream11write_valueIN3Gfx12BitmapFormatEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIvNS_5ErrorEEERKS4_
_ZN2AK6Stream11write_valueIhQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIvNS_5ErrorEEERKS2_
Line
Count
Source
84
79.2M
    {
85
79.2M
        return write_until_depleted({ &value, sizeof(value) });
86
79.2M
    }
_ZN2AK6Stream11write_valueINS_12LittleEndianItEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIvNS_5ErrorEEERKS4_
Line
Count
Source
84
8.83k
    {
85
8.83k
        return write_until_depleted({ &value, sizeof(value) });
86
8.83k
    }
Unexecuted instantiation: _ZN2AK6Stream11write_valueINS_9BigEndianItEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIvNS_5ErrorEEERKS4_
Unexecuted instantiation: _ZN2AK6Stream11write_valueINS_9BigEndianIjEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIvNS_5ErrorEEERKS4_
_ZN2AK6Stream11write_valueIN8Compress10LzmaHeaderEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIvNS_5ErrorEEERKS4_
Line
Count
Source
84
1.88k
    {
85
1.88k
        return write_until_depleted({ &value, sizeof(value) });
86
1.88k
    }
_ZN2AK6Stream11write_valueINS_12LittleEndianIjEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIvNS_5ErrorEEERKS4_
Line
Count
Source
84
4.60k
    {
85
4.60k
        return write_until_depleted({ &value, sizeof(value) });
86
4.60k
    }
_ZN2AK6Stream11write_valueIN3DNS12PacketHeaderEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIvNS_5ErrorEEERKS4_
Line
Count
Source
84
453
    {
85
453
        return write_until_depleted({ &value, sizeof(value) });
86
453
    }
_ZN2AK6Stream11write_valueItQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIvNS_5ErrorEEERKS2_
Line
Count
Source
84
3.71M
    {
85
3.71M
        return write_until_depleted({ &value, sizeof(value) });
86
3.71M
    }
_ZN2AK6Stream11write_valueIcQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIvNS_5ErrorEEERKS2_
Line
Count
Source
84
1.72M
    {
85
1.72M
        return write_until_depleted({ &value, sizeof(value) });
86
1.72M
    }
Unexecuted instantiation: _ZN2AK6Stream11write_valueINS_9BigEndianINS_6Detail12UFixedBigIntILm256ENS3_13StaticStorageILb0ELm256EEEEEEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIvNS_5ErrorEEERKS9_
Unexecuted instantiation: _ZN2AK6Stream11write_valueINS_9BigEndianINS_6Detail12UFixedBigIntILm384ENS3_13StaticStorageILb0ELm384EEEEEEEQclsr6TraitsIT_EE25is_trivially_serializableEEENS_7ErrorOrIvNS_5ErrorEEERKS9_
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
7.24M
    {
108
7.24M
    }
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