Luna/libluna/include/luna/String.h

88 lines
1.5 KiB
C
Raw Normal View History

#pragma once
#include <luna/Result.h>
2023-03-29 15:43:10 +00:00
#include <luna/StringView.h>
2023-04-07 08:37:00 +00:00
#include <stdarg.h>
class String
{
typedef char* Iterator;
typedef const char* ConstIterator;
public:
String(char* c_str);
String(char* c_str, usize length);
String();
String(String&&);
String(const String&) = delete;
2023-04-07 10:14:21 +00:00
String& operator=(String&&);
String& operator=(const String&) = delete;
~String();
Result<String> clone() const;
Result<String> substring(usize begin, usize size) const;
2023-04-07 08:37:00 +00:00
static Result<String> format(const String& fmt, ...);
static Result<String> format(StringView fmt, ...);
static Result<String> from_cstring(const char* str);
const char* chars() const
{
return m_inline ? m_inline_storage : m_string;
}
usize length() const
{
return m_length;
}
bool is_empty() const
{
return m_length == 0;
}
2023-03-29 15:43:10 +00:00
StringView view() const
{
return { chars(), m_length };
}
const char& operator[](usize) const;
Iterator begin()
{
return m_inline ? m_inline_storage : m_string;
}
ConstIterator begin() const
{
return chars();
}
Iterator end()
{
return begin() + m_length;
}
ConstIterator end() const
{
return begin() + m_length;
}
private:
union {
char* m_string { nullptr };
char m_inline_storage[sizeof(char*)];
};
bool m_inline { true };
usize m_length { 0 };
2023-04-07 08:37:00 +00:00
static Result<String> vformat(StringView fmt, va_list ap);
};