From 219a48c616a0f2c886bbbf1b1a356a04beac804e Mon Sep 17 00:00:00 2001 From: Patrick Wuttke Date: Fri, 12 Jan 2024 01:31:43 +0100 Subject: [PATCH] Also added a pretty much untested and totally incomplete STL string type. --- SConstruct | 6 +- {stdlib => bastl}/include/algorithm | 0 {stdlib => bastl}/include/array | 0 {stdlib => bastl}/include/cassert | 0 {stdlib => bastl}/include/cstdarg | 0 {stdlib => bastl}/include/cstddef | 1 + {stdlib => bastl}/include/cstdio | 0 {stdlib => bastl}/include/cstdlib | 0 {stdlib => bastl}/include/cstring | 0 {stdlib => bastl}/include/exception | 0 {stdlib => bastl}/include/new | 0 {stdlib => bastl}/include/stdexcept | 0 bastl/include/string | 125 ++++++++++++++++++++++++++ {stdlib => bastl}/include/type_traits | 0 {stdlib => bastl}/include/utility | 0 {stdlib => bastl}/include/vector | 8 +- {stdlib => bastl}/src/exception.cpp | 0 {stdlib => bastl}/src/new.cpp | 0 include/stdio.h | 4 +- src/app/main.cpp | 4 - src/cstdlib/stdio.cpp | 2 +- 21 files changed, 138 insertions(+), 12 deletions(-) rename {stdlib => bastl}/include/algorithm (100%) rename {stdlib => bastl}/include/array (100%) rename {stdlib => bastl}/include/cassert (100%) rename {stdlib => bastl}/include/cstdarg (100%) rename {stdlib => bastl}/include/cstddef (92%) rename {stdlib => bastl}/include/cstdio (100%) rename {stdlib => bastl}/include/cstdlib (100%) rename {stdlib => bastl}/include/cstring (100%) rename {stdlib => bastl}/include/exception (100%) rename {stdlib => bastl}/include/new (100%) rename {stdlib => bastl}/include/stdexcept (100%) create mode 100644 bastl/include/string rename {stdlib => bastl}/include/type_traits (100%) rename {stdlib => bastl}/include/utility (100%) rename {stdlib => bastl}/include/vector (96%) rename {stdlib => bastl}/src/exception.cpp (100%) rename {stdlib => bastl}/src/new.cpp (100%) diff --git a/SConstruct b/SConstruct index a8ef938..abfc4b1 100644 --- a/SConstruct +++ b/SConstruct @@ -8,7 +8,7 @@ env['CXX'] = 'i686-elf-g++' env['LD'] = 'i686-elf-g++' env.Append(CXXFLAGS = ['-ffreestanding', '-fno-exceptions', '-fno-rtti', '-std=c++20']) env.Append(LINKFLAGS = ['-T', 'linker.ld', '-ffreestanding', '-nostdlib']) -env.Append(CPPPATH = ['#include', '#stdlib/include']) +env.Append(CPPPATH = ['#include', '#bastl/include']) env.Append(CCFLAGS = ['-g', '-O0']) def get_crt_object(name: str) -> str: @@ -36,8 +36,8 @@ os_sources = Split(''' src/cstdlib/stdlib.cpp src/cstdlib/string.cpp - stdlib/src/exception.cpp - stdlib/src/new.cpp + bastl/src/exception.cpp + bastl/src/new.cpp ''') env['LINKCOM'] = env['LINKCOM'].replace('$_LIBFLAGS', f'{crti_o[0]} {crtbegin_o} $_LIBFLAGS {crtend_o} {crtn_o[0]}') diff --git a/stdlib/include/algorithm b/bastl/include/algorithm similarity index 100% rename from stdlib/include/algorithm rename to bastl/include/algorithm diff --git a/stdlib/include/array b/bastl/include/array similarity index 100% rename from stdlib/include/array rename to bastl/include/array diff --git a/stdlib/include/cassert b/bastl/include/cassert similarity index 100% rename from stdlib/include/cassert rename to bastl/include/cassert diff --git a/stdlib/include/cstdarg b/bastl/include/cstdarg similarity index 100% rename from stdlib/include/cstdarg rename to bastl/include/cstdarg diff --git a/stdlib/include/cstddef b/bastl/include/cstddef similarity index 92% rename from stdlib/include/cstddef rename to bastl/include/cstddef index c749377..34da0c0 100644 --- a/stdlib/include/cstddef +++ b/bastl/include/cstddef @@ -8,6 +8,7 @@ namespace std { +using ::nullptr_t; using ::ptrdiff_t; using ::size_t; } diff --git a/stdlib/include/cstdio b/bastl/include/cstdio similarity index 100% rename from stdlib/include/cstdio rename to bastl/include/cstdio diff --git a/stdlib/include/cstdlib b/bastl/include/cstdlib similarity index 100% rename from stdlib/include/cstdlib rename to bastl/include/cstdlib diff --git a/stdlib/include/cstring b/bastl/include/cstring similarity index 100% rename from stdlib/include/cstring rename to bastl/include/cstring diff --git a/stdlib/include/exception b/bastl/include/exception similarity index 100% rename from stdlib/include/exception rename to bastl/include/exception diff --git a/stdlib/include/new b/bastl/include/new similarity index 100% rename from stdlib/include/new rename to bastl/include/new diff --git a/stdlib/include/stdexcept b/bastl/include/stdexcept similarity index 100% rename from stdlib/include/stdexcept rename to bastl/include/stdexcept diff --git a/bastl/include/string b/bastl/include/string new file mode 100644 index 0000000..1f8ed5f --- /dev/null +++ b/bastl/include/string @@ -0,0 +1,125 @@ + +#pragma once + +#if !defined(BAD_APPLE_OS_STRING_INCLUDED) +#define BAD_APPLE_OS_STRING_INCLUDED + +#include +#include +#include +#include + +namespace std +{ +template +class char_traits {}; + +template<> +class char_traits +{ +public: + using char_type = char; + using int_type = int; + using off_type = std::ptrdiff_t; // TODO: should be std::streamoff? + // TODO: ?? +}; + +template> // TODO: Allocator +class basic_string +{ +public: + using traits_type = Traits; + using value_type = CharT; + using size_type = size_t; + using difference_type = ptrdiff_t; + using reference = value_type&; + using const_reference = const value_type&; + using pointer = value_type*; + using const_pointer = const value_type*; + using iterator = pointer; + using const_iterator = const_pointer; +private: + vector _data; +public: + constexpr basic_string() noexcept : basic_string("") {} + constexpr basic_string(const basic_string& other) = default; + constexpr basic_string(basic_string&& other) = default; + constexpr basic_string(size_type count, value_type chr) : _data(count, chr) {} + constexpr basic_string(const basic_string& other, size_type pos, size_type count = npos) + : basic_string(other.substr(pos, count)) {} + constexpr basic_string(const value_type* str, size_type count) + { + _data.resize(count + 1); + for (size_type idx = 0; idx < count; ++idx) { + _data[idx] = str[idx]; + } + _data[count] = value_type(0); + } + constexpr basic_string(const value_type* str) : basic_string(str, strlen(str)) {} // NOLINT + // TODO: all the other constructors + constexpr basic_string& operator=(const basic_string& other) = default; + constexpr basic_string& operator=(basic_string&& other) = default; + constexpr basic_string& operator=(const value_type* str) + { + const size_t count = strlen(str); + _data.resize(count + 1); + for (size_type idx = 0; idx < count; ++idx) { + _data[idx] = str[idx]; + } + _data[count] = value_type(0); + return *this; + } + constexpr basic_string& operator=(value_type chr) + { + _data.resize(2); + _data[0] = chr; + _data[1] = value_type(0); + return *this; + } + constexpr basic_string& operator=(std::nullptr_t) = delete; + + [[nodiscard]] constexpr reference operator[](size_type pos) noexcept { return _data[pos]; } + [[nodiscard]] constexpr const_reference operator[](size_type pos) const noexcept { return _data[pos]; } + + // TODO: the range check should actually also fail for the \0 in the end + [[nodiscard]] constexpr reference at(size_type pos) { return _data.at(pos); } + [[nodiscard]] constexpr const_reference at(size_type pos) const { return _data.at(pos); } + + [[nodiscard]] constexpr reference front() noexcept { return _data.front(); } + [[nodiscard]] constexpr const_reference front() const noexcept { return _data.front(); } + + [[nodiscard]] constexpr reference back() noexcept { return _data.back(); } + [[nodiscard]] constexpr const_reference back() const noexcept { return _data.back(); } + + [[nodiscard]] constexpr pointer data() noexcept { return _data.data(); } + [[nodiscard]] constexpr const_pointer data() const noexcept { return _data.data(); } + + [[nodiscard]] constexpr const_pointer c_str() const noexcept { return data(); } + + [[nodiscard]] constexpr iterator begin() noexcept { return _data.begin(); } + [[nodiscard]] constexpr const_iterator begin() const noexcept { return _data.begin(); } + [[nodiscard]] constexpr const_iterator cbegin() const noexcept { return _data.begin(); } + [[nodiscard]] constexpr iterator end() noexcept { return _data.end() - 1; } + [[nodiscard]] constexpr const_iterator end() const noexcept { return _data.end() - 1; } + [[nodiscard]] constexpr const_iterator cend() const noexcept { return _data.end() - 1; } + + [[nodiscard]] constexpr bool empty() const noexcept { return size() == 0; } + [[nodiscard]] constexpr size_type size() const noexcept { return _data.size() - 1; } + [[nodiscard]] constexpr size_type max_size() const noexcept { return _data.max_size() - 1; } + constexpr void reserve(size_type newCapacity) noexcept { _data.reserve(newCapacity + 1); } + [[nodiscard]] constexpr size_type capacity() const noexcept { return _data.capacity() - 1; } + constexpr void shrink_to_fit() noexcept { _data.shrink_to_fit(); } + + constexpr void clear() { *this = ""; } + constexpr void resize(size_type count, value_type chr = value_type()) + { + _data.resize(count + 1, chr); + _data.back() = value_type(0); + } + + static inline size_type npos = size_type(-1); +}; +using string = basic_string; +} + +#endif // !defined(BAD_APPLE_OS_STRING_INCLUDED) diff --git a/stdlib/include/type_traits b/bastl/include/type_traits similarity index 100% rename from stdlib/include/type_traits rename to bastl/include/type_traits diff --git a/stdlib/include/utility b/bastl/include/utility similarity index 100% rename from stdlib/include/utility rename to bastl/include/utility diff --git a/stdlib/include/vector b/bastl/include/vector similarity index 96% rename from stdlib/include/vector rename to bastl/include/vector index e727baf..d1f63af 100644 --- a/stdlib/include/vector +++ b/bastl/include/vector @@ -44,6 +44,10 @@ public: _capacity(exchange(other._capacity, 0)) { } + constexpr explicit vector(size_type count, const value_type& value = value_type()) + { + resize(count, value); + } constexpr ~vector() noexcept { delete _elements; @@ -72,12 +76,12 @@ public: return *this; } - [[nodiscard]] constexpr reference operator[](size_type pos) + [[nodiscard]] constexpr reference operator[](size_type pos) noexcept { return _elements[pos]; } - [[nodiscard]] constexpr const_reference operator[](size_type pos) const + [[nodiscard]] constexpr const_reference operator[](size_type pos) const noexcept { return _elements[pos]; } diff --git a/stdlib/src/exception.cpp b/bastl/src/exception.cpp similarity index 100% rename from stdlib/src/exception.cpp rename to bastl/src/exception.cpp diff --git a/stdlib/src/new.cpp b/bastl/src/new.cpp similarity index 100% rename from stdlib/src/new.cpp rename to bastl/src/new.cpp diff --git a/include/stdio.h b/include/stdio.h index 00b992f..83536ef 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -4,7 +4,7 @@ #if !defined(BAD_APPLE_OS_STDIO_H_INCLUDED) #define BAD_APPLE_OS_STDIO_H_INCLUDED -#include "../stdlib/include/cstdarg" +#include #include "./detail/common.h" BA_EXTERN_C_BEGIN @@ -12,7 +12,7 @@ BA_EXTERN_C_BEGIN int putchar(int chr) BA_CXX_NOEXCEPT; int puts(const char* str) BA_CXX_NOEXCEPT; int printf(const char* format, ...) BA_CXX_NOEXCEPT; -int vprintf(const char* format, std::va_list vlist) BA_CXX_NOEXCEPT; +int vprintf(const char* format, va_list vlist) BA_CXX_NOEXCEPT; BA_EXTERN_C_END diff --git a/src/app/main.cpp b/src/app/main.cpp index 67b6849..231fbc3 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -1,8 +1,4 @@ -#include - extern "C" void main() { - std::vector someInts; - someInts.resize(100); } diff --git a/src/cstdlib/stdio.cpp b/src/cstdlib/stdio.cpp index c63337f..9815f94 100644 --- a/src/cstdlib/stdio.cpp +++ b/src/cstdlib/stdio.cpp @@ -150,7 +150,7 @@ int printf(const char* format, ...) noexcept return result; } -int vprintf(const char* format, std::va_list vlist) BA_CXX_NOEXCEPT +int vprintf(const char* format, va_list vlist) BA_CXX_NOEXCEPT { int result = 0; const char* pos = format;