Iros
 
Loading...
Searching...
No Matches
file_implementation.h
Go to the documentation of this file.
1#pragma once
2
3#include <errno.h>
4#include <stdio.h>
5#include <stdlib.h>
6
8#include "di/sync/prelude.h"
10#include "dius/error.h"
11#include "dius/sync_file.h"
12
13namespace ccpp {
15public:
17 auto* data = [&] {
18 if (align > 16) {
19 return aligned_alloc(align, size);
20 }
21 return malloc(size);
22 }();
23
24 if (!data) {
25 return di::Unexpected(di::BasicError::NotEnoughMemory);
26 }
28 }
29
30 static void deallocate(void* pointer, usize, usize) { free(pointer); }
31};
32
34 void operator()(FILE* file) const { (void) fclose(file); }
35};
36
38
44
45enum class Permissions {
46 None = 0,
49};
50
52
57
58enum class ReadWriteMode {
59 None = 0,
60 Read = 1,
61 Write = 2,
62};
63
64enum class Status {
65 None = 0,
66 Eof = 1,
67 Error = 2,
68};
69
71
72struct File {
73 explicit File() = default;
74
75 constexpr explicit File(dius::SyncFile file_, byte* buffer_, usize buffer_capacity_, usize buffer_offset_,
76 usize buffer_size_, BufferMode buffer_mode_, BufferOwnership buffer_ownership_,
77 ReadWriteMode read_write_mode_, Status status_, Permissions permissions_)
78 : file(di::move(file_))
79 , buffer(buffer_)
80 , buffer_capacity(buffer_capacity_)
81 , buffer_offset(buffer_offset_)
82 , buffer_size(buffer_size_)
83 , buffer_mode(buffer_mode_)
84 , buffer_ownership(buffer_ownership_)
85 , read_write_mode(read_write_mode_)
86 , status(status_)
87 , permissions(permissions_) {}
88
89 constexpr ~File() {
90 if (buffer_ownership == BufferOwnership::Owned && buffer != nullptr) {
91 auto allocator = MallocAllocator();
93 }
94 }
95
96 inline bool readable() const { return read_write_mode == ReadWriteMode::Read; }
97 inline bool writable() const { return read_write_mode == ReadWriteMode::Write; }
98
101 return di::Unexpected(di::BasicError::BadFileDescriptor);
102 }
104 return di::Unexpected(di::BasicError::BadFileDescriptor);
105 }
107 return {};
108 }
109
112 return di::Unexpected(di::BasicError::BadFileDescriptor);
113 }
115 return di::Unexpected(di::BasicError::BadFileDescriptor);
116 }
118 return {};
119 }
120
125
126 inline void mark_as_error() { status = Status::Error; }
127
128 inline bool at_eof() const { return !!(status & Status::Eof); }
129 inline bool has_error() const { return !!(status & Status::Error); }
130
132 byte* buffer { nullptr };
141};
142
143#define STDIO_TRY(...) \
144 __extension__({ \
145 auto __result = (__VA_ARGS__); \
146 if (!__result) { \
147 errno = di::to_underlying(__result.error().value()); \
148 return EOF; \
149 } \
150 di::util::move(__result).__try_did_succeed(); \
151 }).__try_move_out()
152
153#define STDIO_TRY_OR_MARK_ERROR(file, ...) \
154 __extension__({ \
155 auto __result = (__VA_ARGS__); \
156 if (!__result) { \
157 errno = di::to_underlying(__result.error().value()); \
158 (file).mark_as_error(); \
159 return EOF; \
160 } \
161 di::util::move(__result).__try_did_succeed(); \
162 }).__try_move_out()
163
164#define STDIO_TRY_OR_NULL(...) \
165 __extension__({ \
166 auto __result = (__VA_ARGS__); \
167 if (!__result) { \
168 errno = di::to_underlying(__result.error().value()); \
169 return nullptr; \
170 } \
171 di::util::move(__result).__try_did_succeed(); \
172 }).__try_move_out()
173
174}
175
180 ccpp::File& get_unlocked() { return locked.get_assuming_no_concurrent_accesses(); }
181
182 template<typename... Args>
183 // requires(di::concepts::ConstructibleFrom<ccpp::File, Args...>)
184 constexpr explicit __file_implementation(Args&&... args) : locked(di::in_place, di::forward<Args>(args)...) {}
185
187};
auto aligned_alloc(size_t alignment, size_t size) -> void *
Definition aligned_alloc.cpp:8
#define DI_DEFINE_ENUM_BITWISE_OPERATIONS(Type)
Definition bitwise_enum.h:5
Definition synchronized.h:17
Definition box.h:28
Definition expected_forward_declaration.h:8
Definition unexpected.h:14
Definition sync_file.h:40
constexpr usize size
Definition gfx_test.cpp:24
Definition getopt.cpp:3
di::Box< FILE, FileDeleter > FileHandle
Definition file_implementation.h:37
ReadWriteMode
Definition file_implementation.h:58
@ Write
Definition file_implementation.h:61
@ None
Definition file_implementation.h:59
@ Read
Definition file_implementation.h:60
BufferMode
Definition file_implementation.h:39
@ LineBuffered
Definition file_implementation.h:41
@ FullBuffered
Definition file_implementation.h:42
@ NotBuffered
Definition file_implementation.h:40
Status
Definition file_implementation.h:64
@ Eof
Definition file_implementation.h:66
@ None
Definition file_implementation.h:65
@ Error
Definition file_implementation.h:67
BufferOwnership
Definition file_implementation.h:53
@ Owned
Definition file_implementation.h:54
@ UserProvided
Definition file_implementation.h:55
Permissions
Definition file_implementation.h:45
@ Readable
Definition file_implementation.h:47
@ None
Definition file_implementation.h:46
@ Writable
Definition file_implementation.h:48
size_t usize
Definition integers.h:33
StatusCode< platform::GenericDomain > GenericCode
Definition status_code_forward_declaration.h:13
Definition zstring_parser.h:9
constexpr auto data
Definition data.h:51
constexpr auto in_place
Definition in_place.h:8
constexpr auto deallocate_many
Definition deallocate_many.h:28
int fclose(FILE *__file)
Definition fclose.cpp:4
struct __file_implementation FILE
Definition stdio.h:26
#define _IONBF
Definition stdio.h:14
#define _IOLBF
Definition stdio.h:13
#define _IOFBF
Definition stdio.h:12
void * malloc(size_t __size)
Definition malloc.cpp:5
void free(void *__pointer)
Definition free.cpp:7
constexpr __file_implementation(Args &&... args)
Definition file_implementation.h:184
ccpp::File & get_unlocked()
Get the file implementation.
Definition file_implementation.h:180
di::Synchronized< ccpp::File > locked
Definition file_implementation.h:186
Definition file_implementation.h:33
void operator()(FILE *file) const
Definition file_implementation.h:34
Definition file_implementation.h:72
usize buffer_size
Definition file_implementation.h:135
Permissions permissions
Definition file_implementation.h:140
constexpr File(dius::SyncFile file_, byte *buffer_, usize buffer_capacity_, usize buffer_offset_, usize buffer_size_, BufferMode buffer_mode_, BufferOwnership buffer_ownership_, ReadWriteMode read_write_mode_, Status status_, Permissions permissions_)
Definition file_implementation.h:75
void mark_as_eof()
Definition file_implementation.h:121
Status status
Definition file_implementation.h:139
byte * buffer
Definition file_implementation.h:132
usize buffer_capacity
Definition file_implementation.h:133
dius::SyncFile file
Definition file_implementation.h:131
File()=default
BufferOwnership buffer_ownership
Definition file_implementation.h:137
bool has_error() const
Definition file_implementation.h:129
void mark_as_error()
Definition file_implementation.h:126
usize buffer_offset
Definition file_implementation.h:134
bool writable() const
Definition file_implementation.h:97
di::Expected< void, di::GenericCode > mark_as_writable()
Definition file_implementation.h:110
BufferMode buffer_mode
Definition file_implementation.h:136
di::Expected< void, di::GenericCode > mark_as_readable()
Definition file_implementation.h:99
bool readable() const
Definition file_implementation.h:96
ReadWriteMode read_write_mode
Definition file_implementation.h:138
constexpr ~File()
Definition file_implementation.h:89
bool at_eof() const
Definition file_implementation.h:128
Definition file_implementation.h:14
static void deallocate(void *pointer, usize, usize)
Definition file_implementation.h:30
static di::Expected< di::container::AllocationResult<>, di::GenericCode > allocate(usize size, usize align)
Definition file_implementation.h:16
Definition allocation_result.h:7