Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:54:51

0001 ///////////////////////////////////////////////////////////////////////////////
0002 // Copyright (c) Lewis Baker
0003 // Licenced under MIT license. See LICENSE.txt for details.
0004 ///////////////////////////////////////////////////////////////////////////////
0005 #ifndef CPPCORO_FILE_WRITE_OPERATION_HPP_INCLUDED
0006 #define CPPCORO_FILE_WRITE_OPERATION_HPP_INCLUDED
0007 
0008 #include <cppcoro/config.hpp>
0009 #include <cppcoro/cancellation_registration.hpp>
0010 #include <cppcoro/cancellation_token.hpp>
0011 
0012 #include <atomic>
0013 #include <optional>
0014 
0015 #if CPPCORO_OS_WINNT
0016 # include <cppcoro/detail/win32.hpp>
0017 # include <cppcoro/detail/win32_overlapped_operation.hpp>
0018 
0019 namespace cppcoro
0020 {
0021     class file_write_operation_impl
0022     {
0023     public:
0024 
0025         file_write_operation_impl(
0026             detail::win32::handle_t fileHandle,
0027             const void* buffer,
0028             std::size_t byteCount) noexcept
0029             : m_fileHandle(fileHandle)
0030             , m_buffer(buffer)
0031             , m_byteCount(byteCount)
0032         {}
0033 
0034         bool try_start(cppcoro::detail::win32_overlapped_operation_base& operation) noexcept;
0035         void cancel(cppcoro::detail::win32_overlapped_operation_base& operation) noexcept;
0036 
0037     private:
0038 
0039         detail::win32::handle_t m_fileHandle;
0040         const void* m_buffer;
0041         std::size_t m_byteCount;
0042 
0043     };
0044 
0045     class file_write_operation
0046         : public cppcoro::detail::win32_overlapped_operation<file_write_operation>
0047     {
0048     public:
0049 
0050         file_write_operation(
0051             detail::win32::handle_t fileHandle,
0052             std::uint64_t fileOffset,
0053             const void* buffer,
0054             std::size_t byteCount) noexcept
0055             : cppcoro::detail::win32_overlapped_operation<file_write_operation>(fileOffset)
0056             , m_impl(fileHandle, buffer, byteCount)
0057         {}
0058 
0059     private:
0060 
0061         friend class cppcoro::detail::win32_overlapped_operation<file_write_operation>;
0062 
0063         bool try_start() noexcept { return m_impl.try_start(*this); }
0064 
0065         file_write_operation_impl m_impl;
0066 
0067     };
0068 
0069     class file_write_operation_cancellable
0070         : public cppcoro::detail::win32_overlapped_operation_cancellable<file_write_operation_cancellable>
0071     {
0072     public:
0073 
0074         file_write_operation_cancellable(
0075             detail::win32::handle_t fileHandle,
0076             std::uint64_t fileOffset,
0077             const void* buffer,
0078             std::size_t byteCount,
0079             cancellation_token&& ct) noexcept
0080             : cppcoro::detail::win32_overlapped_operation_cancellable<file_write_operation_cancellable>(fileOffset, std::move(ct))
0081             , m_impl(fileHandle, buffer, byteCount)
0082         {}
0083 
0084     private:
0085 
0086         friend class cppcoro::detail::win32_overlapped_operation_cancellable<file_write_operation_cancellable>;
0087 
0088         bool try_start() noexcept { return m_impl.try_start(*this); }
0089         void cancel() noexcept { m_impl.cancel(*this); }
0090 
0091         file_write_operation_impl m_impl;
0092 
0093     };
0094 }
0095 
0096 #endif // CPPCORO_OS_WINNT
0097 
0098 #endif