src/corosio/src/stream_file.cpp

100.0% Lines (53/53) 100.0% List of functions (13/13) 100.0% Branches (23/23)
stream_file.cpp
f(x) Functions (13)
Line Branch TLA Hits Source Code
1 //
2 // Copyright (c) 2026 Michael Vandeberg
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // Official repository: https://github.com/cppalliance/corosio
8 //
9
10 #include <boost/corosio/stream_file.hpp>
11 #include <boost/corosio/detail/except.hpp>
12 #include <boost/corosio/detail/platform.hpp>
13
14 #if BOOST_COROSIO_HAS_IOCP
15 #include <boost/corosio/native/detail/iocp/win_file_service.hpp>
16 #else
17 #include <boost/corosio/detail/file_service.hpp>
18 #endif
19
20 namespace boost::corosio {
21
22 48x stream_file::~stream_file()
23 {
24 48x close();
25 48x }
26
27 41x stream_file::stream_file(capy::execution_context& ctx)
28 #if BOOST_COROSIO_HAS_IOCP
29
1/1
✓ Branch 2 → 3 taken 41 times.
41x : io_object(create_handle<detail::win_file_service>(ctx))
30 #else
31 : io_object(create_handle<detail::file_service>(ctx))
32 #endif
33 {
34 41x }
35
36 std::error_code
37 38x stream_file::open(
38 std::filesystem::path const& path, file_base::flags mode) noexcept
39 {
40
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 37 times.
38x if (is_open())
41 1x close();
42 38x auto& svc = static_cast<detail::file_service&>(h_.service());
43 38x return svc.open_file(get(), path, mode);
44 }
45
46 void
47 56x stream_file::close() noexcept
48 {
49
2/2
✓ Branch 3 → 4 taken 19 times.
✓ Branch 3 → 5 taken 37 times.
56x if (!is_open())
50 19x return;
51 37x h_.service().close(h_);
52 }
53
54 void
55 2x stream_file::cancel() noexcept
56 {
57
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 1 time.
2x if (!is_open())
58 1x return;
59 1x get().cancel();
60 }
61
62 native_handle_type
63 2x stream_file::native_handle() const noexcept
64 {
65
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 1 time.
2x if (!is_open())
66 {
67 #if BOOST_COROSIO_HAS_IOCP
68 1x return static_cast<native_handle_type>(~0ull);
69 #else
70 return -1;
71 #endif
72 }
73 1x return get().native_handle();
74 }
75
76 std::uint64_t
77 8x stream_file::size() const
78 {
79
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 6 taken 7 times.
8x if (!is_open())
80 1x detail::throw_system_error(
81 1x make_error_code(std::errc::bad_file_descriptor),
82 "stream_file::size");
83 7x return get().size();
84 }
85
86 std::error_code
87 4x stream_file::resize(std::uint64_t new_size) noexcept
88 {
89
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 3 times.
4x if (!is_open())
90 1x return make_error_code(std::errc::bad_file_descriptor);
91 3x return get().resize(new_size);
92 }
93
94 std::error_code
95 3x stream_file::sync_data() noexcept
96 {
97
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 2 times.
3x if (!is_open())
98 1x return make_error_code(std::errc::bad_file_descriptor);
99 2x return get().sync_data();
100 }
101
102 std::error_code
103 3x stream_file::sync_all() noexcept
104 {
105
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 2 times.
3x if (!is_open())
106 1x return make_error_code(std::errc::bad_file_descriptor);
107 2x return get().sync_all();
108 }
109
110 native_handle_type
111 2x stream_file::release()
112 {
113
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 6 taken 1 time.
2x if (!is_open())
114 1x detail::throw_system_error(
115 1x make_error_code(std::errc::bad_file_descriptor),
116 "stream_file::release");
117 1x return get().release();
118 }
119
120 std::error_code
121 2x stream_file::assign(native_handle_type handle) noexcept
122 {
123
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 1 time.
2x if (is_open())
124 1x close();
125 2x return get().assign(handle);
126 }
127
128 capy::io_result<std::uint64_t>
129 13x stream_file::seek(std::int64_t offset, file_base::seek_basis origin) noexcept
130 {
131
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 7 taken 12 times.
13x if (!is_open())
132 1x return {make_error_code(std::errc::bad_file_descriptor), 0};
133 12x return get().seek(offset, origin);
134 }
135
136 } // namespace boost::corosio
137