Skip to content

Commit 624ad36

Browse files
authored
Merge pull request #2 from per-framework/feature/defaulted
Add `defaulted<Value, defaults...>` and `zeroed<Value>`
2 parents 8528309 + 95eb852 commit 624ad36

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include "dumpster_v1/defaulted.hpp"
2+
3+
#include "testing_v1/test.hpp"
4+
5+
using namespace testing_v1;
6+
7+
auto defaulted_test = test([]() {
8+
{
9+
dumpster_v1::defaulted<int, 42> x;
10+
verify(x.value == 42);
11+
x = 101;
12+
verify(x == 101);
13+
}
14+
{
15+
dumpster_v1::defaulted<short, 42> x(short(101));
16+
verify(x == 101);
17+
}
18+
{
19+
const dumpster_v1::zeroed<std::size_t> x;
20+
verify(x == 0);
21+
}
22+
{
23+
dumpster_v1::zeroed<char *> x;
24+
verify(x == nullptr);
25+
}
26+
});
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#pragma once
2+
3+
#include "dumpster_v1/synopsis.hpp"
4+
5+
#include <utility>
6+
7+
template <class Value, auto... defaults>
8+
dumpster_v1::defaulted<Value, defaults...>::defaulted() : value(defaults...) {}
9+
10+
template <class Value, auto... defaults>
11+
template <class... Arguments>
12+
dumpster_v1::defaulted<Value, defaults...>::defaulted(Arguments &&... arguments)
13+
: value(std::forward<Arguments>(arguments)...) {}
14+
15+
template <class Value, auto... defaults>
16+
dumpster_v1::defaulted<Value, defaults...>::operator const Value &() const {
17+
return value;
18+
}
19+
20+
template <class Value, auto... defaults>
21+
dumpster_v1::defaulted<Value, defaults...>::operator Value &() {
22+
return value;
23+
}

provides/include/dumpster_v1/synopsis.hpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,34 @@
44

55
namespace dumpster_v1 {
66

7+
// defaulted.hpp ===============================================================
8+
9+
// Default initializes a value with the given arguments.
10+
template <class Value, auto... defaults> struct defaulted {
11+
/// Default constructor initializes value with the defaults given as template
12+
/// arguments.
13+
defaulted();
14+
15+
/// Non-default constructor initializes value with given arguments.
16+
template <class... Arguments> defaulted(Arguments &&... arguments);
17+
18+
/// Implicit conversion to const reference for convenience.
19+
operator const Value &() const;
20+
21+
/// Implicit conversion to reference for convenience.
22+
operator Value &();
23+
24+
/// The value is directly accessible as there is no reason to hide it.
25+
Value value;
26+
};
27+
28+
// Zero initializes a value of the given type.
29+
template <class Value>
30+
using zeroed =
31+
defaulted<Value,
32+
std::conditional_t<std::is_pointer_v<Value>, std::nullptr_t, int>(
33+
0)>;
34+
735
// finally.hpp =================================================================
836

937
/// Finalizer that invokes stored action when destroyed.

0 commit comments

Comments
 (0)