Skip to content

Commit 8877a2e

Browse files
authored
Merge pull request #14 from winner245/winner245/dev
Winner245/dev
2 parents 443d578 + 6bd3161 commit 8877a2e

File tree

5 files changed

+37
-38
lines changed

5 files changed

+37
-38
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
.cache/
22
build/
33
out/
4+
.vscode/

Array.hpp

+14-14
Original file line numberDiff line numberDiff line change
@@ -120,28 +120,28 @@ struct Array {
120120
return _M_elements + _N;
121121
}
122122

123-
std::reverse_iterator<_Tp const *> crbegin() const noexcept {
124-
return std::make_reverse_iterator(_M_elements);
123+
const_reverse_iterator crbegin() const noexcept {
124+
return const_reverse_iterator(end());
125125
}
126126

127-
std::reverse_iterator<_Tp const *> crend() const noexcept {
128-
return std::make_reverse_iterator(_M_elements + _N);
127+
const_reverse_iterator crend() const noexcept {
128+
return const_reverse_iterator(begin());
129129
}
130130

131-
std::reverse_iterator<_Tp const *> rbegin() const noexcept {
132-
return std::make_reverse_iterator(_M_elements);
131+
const_reverse_iterator rbegin() const noexcept {
132+
return const_reverse_iterator(end());
133133
}
134134

135-
std::reverse_iterator<_Tp const *> rend() const noexcept {
136-
return std::make_reverse_iterator(_M_elements + _N);
135+
const_reverse_iterator rend() const noexcept {
136+
return const_reverse_iterator(begin());
137137
}
138138

139-
std::reverse_iterator<_Tp *> rbegin() noexcept {
140-
return std::make_reverse_iterator(_M_elements);
139+
reverse_iterator rbegin() noexcept {
140+
return reverse_iterator(end());
141141
}
142142

143-
std::reverse_iterator<_Tp *> rend() noexcept {
144-
return std::make_reverse_iterator(_M_elements + _N);
143+
reverse_iterator rend() noexcept {
144+
return reverse_iterator(begin());
145145
}
146146

147147
_LIBPENGCXX_DEFINE_COMPARISON(Array);
@@ -273,5 +273,5 @@ struct Array<_Tp, 0> {
273273
};
274274

275275

276-
template <class _Tp, class ..._Ts>
277-
Array(_Tp, _Ts...) -> Array<_Tp, 1 + sizeof...(_Ts)>;
276+
template <class _Tp, class ..._Ts>
277+
Array(_Tp, _Ts...) -> Array<std::enable_if_t<(std::is_same_v<_Tp, _Ts> && ...), _Tp>, 1 + sizeof...(_Ts)>;

List.hpp

+10-24
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ struct List {
6161

6262
void deleteNode(ListNode *node) noexcept {
6363
AllocNode allocNode{m_alloc};
64-
std::allocator_traits<AllocNode>::deallocate(allocNode, static_cast<ListValueNode<T> *>(node));
64+
std::allocator_traits<AllocNode>::deallocate(allocNode, static_cast<ListValueNode<T> *>(node), 1);
6565
}
6666

6767
public:
@@ -114,8 +114,8 @@ struct List {
114114
assign(that.cbegin(), that.cend());
115115
}
116116

117-
bool empty() noexcept {
118-
return m_dummy.m_prev == m_dummy.m_next;
117+
bool empty() const noexcept {
118+
return m_dummy.m_next == &m_dummy;
119119
}
120120

121121
T &front() noexcept {
@@ -178,30 +178,16 @@ struct List {
178178
prev->m_next = &m_dummy;
179179
}
180180

181-
void _uninit_assign(size_t n, T const &val) {
181+
template<typename... Args>
182+
requires std::constructible_from<value_type, Args...>
183+
void _uninit_assign(size_t n, Args&&... args) {
182184
ListNode *prev = &m_dummy;
183-
while (n) {
184-
ListNode *node = newNode();
185-
prev->m_next = node;
186-
node->m_prev = prev;
187-
std::construct_at(&node->value(), val);
188-
prev = node;
189-
--n;
190-
}
191-
m_dummy.m_prev = prev;
192-
prev->m_next = &m_dummy;
193-
m_size = n;
194-
}
195-
196-
void _uninit_assign(size_t n) {
197-
ListNode *prev = &m_dummy;
198-
while (n) {
185+
for (size_t i = 0; i < n; ++i) {
199186
ListNode *node = newNode();
200187
prev->m_next = node;
201188
node->m_prev = prev;
202-
std::construct_at(&node->value());
189+
std::construct_at(&node->value(), std::forward<Args>(args)...);
203190
prev = node;
204-
--n;
205191
}
206192
m_dummy.m_prev = prev;
207193
prev->m_next = &m_dummy;
@@ -213,7 +199,7 @@ struct List {
213199
return m_size;
214200
}
215201

216-
static constexpr std::size_t max_size() noexcept {
202+
constexpr std::size_t max_size() const noexcept {
217203
return std::numeric_limits<std::size_t>::max();
218204
}
219205

@@ -345,7 +331,7 @@ struct List {
345331

346332
iterator operator--(int) noexcept { // iterator--
347333
auto tmp = *this;
348-
++*this;
334+
--*this;
349335
return tmp;
350336
}
351337

test_Array.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,9 @@ int main() {
4747
}
4848
std::cout << "front:" << a.front() << '\n';
4949
std::cout << "back:" << a.back() << '\n';
50+
for (auto it = a.rbegin(); it != a.rend(); ++it) {
51+
std::cout << *it << " ";
52+
}
53+
std::cout << '\n';
5054
return 0;
5155
}

test_List.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,12 @@ int main() {
3131
printf("arr[%zd] = %d\n", i, val);
3232
}
3333
printf("arr.size() = %zd\n", arr.size());
34+
arr2.erase(++arr2.begin(), arr2.end());
35+
std::cout << std::boolalpha << "arr2.size() = " << arr2.size()
36+
<< ", arr2.empty() = " << arr2.empty() << '\n';
37+
arr2.erase(arr2.begin());
38+
std::cout << std::boolalpha << "arr2.size() = " << arr2.size()
39+
<< ", arr2.empty() = " << arr2.empty() << '\n';
40+
List<int> arr3(3);
41+
std::cout << arr3.size() << '\n';
3442
}

0 commit comments

Comments
 (0)