src/corosio/src/stream_file.cpp

100.0% Lines (54/54) 100.0% List of functions (13/13) 100.0% Branches (24/24)
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/error.hpp>
12 #include <boost/corosio/detail/except.hpp>
13 #include <boost/corosio/detail/platform.hpp>
14
15 #if BOOST_COROSIO_HAS_IOCP
16 #include <boost/corosio/native/detail/iocp/win_file_service.hpp>
17 #else
18 #include <boost/corosio/detail/file_service.hpp>
19 #endif
20
21 #include "src/detail/use_backend_service.hpp"
22
23 namespace boost::corosio {
24
25 315x stream_file::~stream_file()
26 {
27 315x close();
28 315x }
29
30 307x stream_file::stream_file(capy::execution_context& ctx)
31 307x : io_object(handle(
32 ctx,
33 detail::use_backend_service<
34 detail::stream_file_service_of,
35 #if BOOST_COROSIO_HAS_IOCP
36 detail::win_file_service
37 #else
38 detail::file_service
39 #endif
40
2/2
✓ Branch 2 → 3 taken 307 times.
✓ Branch 3 → 4 taken 307 times.
614x >(ctx)))
41 {
42 307x }
43
44 std::error_code
45 326x stream_file::open(
46 std::filesystem::path const& path, file_base::flags mode) noexcept
47 {
48
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 325 times.
326x if (is_open())
49 1x close();
50 326x auto& svc = static_cast<detail::file_service&>(h_.service());
51 326x return svc.open_file(get(), path, mode);
52 }
53
54 void
55 575x stream_file::close() noexcept
56 {
57
2/2
✓ Branch 3 → 4 taken 80 times.
✓ Branch 3 → 5 taken 495 times.
575x if (!is_open())
58 80x return;
59 495x h_.service().close(h_);
60 }
61
62 void
63 2x stream_file::cancel() noexcept
64 {
65
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 1 time.
2x if (!is_open())
66 1x return;
67 1x get().cancel();
68 }
69
70 native_handle_type
71 8x stream_file::native_handle() const noexcept
72 {
73
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 7 times.
8x if (!is_open())
74 {
75 #if BOOST_COROSIO_HAS_IOCP
76 1x return static_cast<native_handle_type>(~0ull);
77 #else
78 return -1;
79 #endif
80 }
81 7x return get().native_handle();
82 }
83
84 std::uint64_t
85 8x stream_file::size() const
86 {
87
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 6 taken 7 times.
8x if (!is_open())
88 1x detail::throw_system_error(
89 1x make_error_code(std::errc::bad_file_descriptor),
90 "stream_file::size");
91 7x return get().size();
92 }
93
94 std::error_code
95 6x stream_file::resize(std::uint64_t new_size) noexcept
96 {
97
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 5 times.
6x if (!is_open())
98 1x return make_error_code(std::errc::bad_file_descriptor);
99 5x return get().resize(new_size);
100 }
101
102 std::error_code
103 5x stream_file::sync_data() noexcept
104 {
105
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 4 times.
5x if (!is_open())
106 1x return make_error_code(std::errc::bad_file_descriptor);
107 4x return get().sync_data();
108 }
109
110 std::error_code
111 4x stream_file::sync_all() noexcept
112 {
113
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 3 times.
4x if (!is_open())
114 1x return make_error_code(std::errc::bad_file_descriptor);
115 3x return get().sync_all();
116 }
117
118 native_handle_type
119 6x stream_file::release()
120 {
121
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 6 taken 5 times.
6x if (!is_open())
122 1x detail::throw_system_error(
123 1x make_error_code(std::errc::bad_file_descriptor),
124 "stream_file::release");
125 5x return get().release();
126 }
127
128 std::error_code
129 211x stream_file::assign(native_handle_type handle) noexcept
130 {
131
2/2
✓ Branch 3 → 4 taken 3 times.
✓ Branch 3 → 5 taken 208 times.
211x if (is_open())
132 3x return make_error_code(error::already_open);
133 208x return get().assign(handle);
134 }
135
136 capy::io_result<std::uint64_t>
137 218x stream_file::seek(std::int64_t offset, file_base::seek_basis origin) noexcept
138 {
139
2/2
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 7 taken 217 times.
218x if (!is_open())
140 1x return {make_error_code(std::errc::bad_file_descriptor), 0};
141 217x return get().seek(offset, origin);
142 }
143
144 } // namespace boost::corosio
145