banan-os/BAN/include/BAN/String.h

92 lines
1.8 KiB
C
Raw Normal View History

#pragma once
2022-12-13 14:33:38 +02:00
#include <BAN/ForwardList.h>
#include <BAN/Formatter.h>
2022-12-13 14:33:38 +02:00
namespace BAN
{
class String
{
public:
using size_type = size_t;
public:
String();
String(const String&);
String(String&&);
String(StringView);
2022-12-13 14:33:38 +02:00
~String();
template<typename... Args>
static String formatted(const char* format, const Args&... args);
String& operator=(const String&);
String& operator=(String&&);
2023-01-13 00:55:58 +02:00
String& operator=(StringView);
ErrorOr<void> push_back(char);
ErrorOr<void> insert(char, size_type);
ErrorOr<void> insert(StringView, size_type);
ErrorOr<void> append(StringView);
ErrorOr<void> append(const String&);
void pop_back();
void remove(size_type);
void erase(size_type, size_type);
2022-12-13 14:33:38 +02:00
void clear();
2022-12-13 14:33:38 +02:00
char operator[](size_type) const;
char& operator[](size_type);
bool operator==(const String&) const;
bool operator==(StringView) const;
bool operator==(const char*) const;
ErrorOr<void> resize(size_type, char = '\0');
ErrorOr<void> reserve(size_type);
ErrorOr<void> shrink_to_fit();
2022-12-13 14:33:38 +02:00
StringView sv() const;
bool empty() const;
size_type size() const;
size_type capacity() const;
2022-12-13 14:33:38 +02:00
const char* data() const;
2022-12-13 14:33:38 +02:00
private:
ErrorOr<void> ensure_capacity(size_type);
2022-12-13 14:33:38 +02:00
ErrorOr<void> copy_impl(StringView);
void move_impl(String&&);
2022-12-13 14:33:38 +02:00
private:
char* m_data = nullptr;
size_type m_capacity = 0;
2022-12-13 14:33:38 +02:00
size_type m_size = 0;
};
template<typename... Args>
String String::formatted(const char* format, const Args&... args)
{
String result;
BAN::Formatter::print([&](char c){ result.push_back(c); }, format, args...);
return result;
}
}
namespace BAN::Formatter
{
template<typename F>
void print_argument(F putc, const String& string, const ValueFormat&)
{
for (String::size_type i = 0; i < string.size(); i++)
putc(string[i]);
}
}