aboutsummaryrefslogtreecommitdiffstats
path: root/nihil.posix/posix.argv.cc
blob: e6b138993a97c27dce43e9252d3b8a245f4ab1ad (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 * This source code is released into the public domain.
 */

module;

#include <memory>
#include <ranges>
#include <string>
#include <vector>

module nihil.posix;

namespace nihil {

argv::argv() = default;
argv::argv(argv &&) noexcept = default;
auto argv::operator=(this argv &, argv &&) -> argv & = default;

argv::~argv()
{
	for (auto *arg : m_args)
		delete[] arg;
}

auto argv::data(this argv const &self) -> char const * const *
{
	return self.m_args.data();
}

auto argv::data(this argv &self) -> char * const *
{
	return self.m_args.data();
}

auto argv::size(this argv const &self)
{
	return self.m_args.size();
}

auto argv::begin(this argv const &self)
{
	return self.m_args.begin();
}

auto argv::end(this argv const &self)
{
	return self.m_args.end();
}


auto argv::add_arg(this argv &self, std::string_view arg) -> void
{
	// Create a nul-terminated C string.
	auto ptr = std::make_unique<char[]>(arg.size() + 1);
	std::ranges::copy(arg, ptr.get());
	ptr[arg.size()] = '\0';

	// Ensure we won't throw when emplacing the pointer.
	self.m_args.reserve(self.m_args.size() + 1);
	self.m_args.emplace_back(ptr.release());
}

} // namespace nihil