Compare commits
3 Commits
8e0865384d
...
c48e79753d
Author | SHA1 | Date | |
---|---|---|---|
c48e79753d | |||
eda801d3c7 | |||
64045b1d48 |
2
LICENSE
2
LICENSE
@ -1,6 +1,6 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2024-2024 yyc12345
|
||||
Copyright (c) 2024-2025 yyc12345
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -29,7 +29,7 @@ In short words, this library use UTF8 encoding everywhere except some special ca
|
||||
\li Traditional format function in yycc::string::op.
|
||||
Traditional format function provide some overloads for ordinary string formatting.
|
||||
That's because this feature is so common to use in some cases.
|
||||
\li The message of Rust panic in yycc::rust::panic.
|
||||
\li The message of Rust panic in yycc::panic.
|
||||
Due to the limitation of \c std::format, we only can use ordinary string as its message content.
|
||||
\li The message of standard library exception.
|
||||
For the compatibility with C++ standard library exception,
|
||||
|
@ -15,8 +15,8 @@ PRIVATE
|
||||
yycc/string/op.cpp
|
||||
yycc/patch/fopen.cpp
|
||||
yycc/patch/stream.cpp
|
||||
yycc/rust/panic.cpp
|
||||
yycc/rust/env.cpp
|
||||
yycc/panic.cpp
|
||||
yycc/env.cpp
|
||||
yycc/windows/com.cpp
|
||||
yycc/windows/dialog.cpp
|
||||
yycc/windows/winfct.cpp
|
||||
@ -53,6 +53,7 @@ FILES
|
||||
yycc/macro/class_copy_move.hpp
|
||||
yycc/macro/printf_checker.hpp
|
||||
yycc/flag_enum.hpp
|
||||
yycc/string.hpp
|
||||
yycc/string/reinterpret.hpp
|
||||
yycc/string/op.hpp
|
||||
yycc/patch/ptr_pad.hpp
|
||||
@ -64,12 +65,12 @@ FILES
|
||||
yycc/num/safe_cast.hpp
|
||||
yycc/num/safe_op.hpp
|
||||
yycc/num/op.hpp
|
||||
yycc/rust/prelude.hpp
|
||||
yycc/rust/primitive.hpp
|
||||
yycc/rust/panic.hpp
|
||||
yycc/rust/option.hpp
|
||||
yycc/rust/result.hpp
|
||||
yycc/rust/env.hpp
|
||||
yycc/primitive.hpp
|
||||
yycc/option.hpp
|
||||
yycc/result.hpp
|
||||
yycc/prelude.hpp
|
||||
yycc/panic.hpp
|
||||
yycc/env.hpp
|
||||
yycc/windows/import_guard_head.hpp
|
||||
yycc/windows/import_guard_tail.hpp
|
||||
yycc/windows/com.hpp
|
||||
|
@ -3,7 +3,7 @@
|
||||
#include "../../patch/stream.hpp"
|
||||
#include "../../patch/format.hpp"
|
||||
#include "../../string/op.hpp"
|
||||
#include "../../rust/env.hpp"
|
||||
#include "../../env.hpp"
|
||||
#include <ranges>
|
||||
|
||||
#define CLAP ::yycc::carton::clap
|
||||
@ -11,7 +11,7 @@
|
||||
#define TERMCOLOR ::yycc::carton::termcolor
|
||||
#define OP ::yycc::string::op
|
||||
#define FORMAT ::yycc::patch::format
|
||||
#define ENV ::yycc::rust::env
|
||||
#define ENV ::yycc::env
|
||||
|
||||
using namespace ::yycc::patch::stream;
|
||||
|
||||
|
@ -1,15 +1,15 @@
|
||||
#include "env.hpp"
|
||||
#include "../macro/os_detector.hpp"
|
||||
#include "macro/os_detector.hpp"
|
||||
|
||||
// Environment variable required
|
||||
#if defined(YYCC_OS_WINDOWS)
|
||||
#include "../encoding/windows.hpp"
|
||||
#include "../num/safe_op.hpp"
|
||||
#include "../num/safe_cast.hpp"
|
||||
#include "encoding/windows.hpp"
|
||||
#include "num/safe_op.hpp"
|
||||
#include "num/safe_cast.hpp"
|
||||
#include <Windows.h>
|
||||
#include <winbase.h>
|
||||
#else
|
||||
#include "../string/reinterpret.hpp"
|
||||
#include "string/reinterpret.hpp"
|
||||
#include <cstdlib>
|
||||
#include <cerrno>
|
||||
#include <stdexcept>
|
||||
@ -17,7 +17,7 @@
|
||||
|
||||
// Path related functions required
|
||||
#if defined(YYCC_OS_WINDOWS)
|
||||
#include "../windows/winfct.hpp"
|
||||
#include "windows/winfct.hpp"
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
@ -29,7 +29,7 @@
|
||||
#define REINTERPRET ::yycc::string::reinterpret
|
||||
#define WINFCT ::yycc::windows::winfct
|
||||
|
||||
namespace yycc::rust::env {
|
||||
namespace yycc::env {
|
||||
|
||||
#pragma region Environment Variable
|
||||
|
||||
@ -207,4 +207,4 @@ namespace yycc::rust::env {
|
||||
|
||||
#pragma endregion
|
||||
|
||||
} // namespace yycc::rust::env
|
||||
} // namespace yycc::env
|
@ -14,7 +14,7 @@
|
||||
* I create this namespace inspired from Rust standard library
|
||||
* to glue all these things up and make a uniform interface.
|
||||
*/
|
||||
namespace yycc::rust::env {
|
||||
namespace yycc::env {
|
||||
|
||||
#pragma region Environment Variable
|
||||
|
||||
@ -86,4 +86,4 @@ namespace yycc::rust::env {
|
||||
|
||||
#pragma endregion
|
||||
|
||||
} // namespace yycc::rust::env
|
||||
} // namespace yycc::env
|
@ -7,7 +7,7 @@
|
||||
* This namespace reproduce Rust Option type, and its members Some and None in C++.
|
||||
* However Option is not important than Result, so its implementation is very casual.
|
||||
*/
|
||||
namespace yycc::rust::option {
|
||||
namespace yycc::option {
|
||||
|
||||
template<typename T>
|
||||
using Option = std::optional<T>;
|
||||
@ -22,4 +22,4 @@ namespace yycc::rust::option {
|
||||
return OptionType(std::nullopt);
|
||||
}
|
||||
|
||||
} // namespace yycc::rust::option
|
||||
} // namespace yycc::option
|
@ -1,6 +1,6 @@
|
||||
#include "panic.hpp"
|
||||
#include "../carton/termcolor.hpp"
|
||||
#include "../patch/stream.hpp"
|
||||
#include "carton/termcolor.hpp"
|
||||
#include "patch/stream.hpp"
|
||||
#include <cstdlib>
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
@ -10,7 +10,7 @@
|
||||
|
||||
using namespace yycc::patch::stream;
|
||||
|
||||
namespace yycc::rust::panic {
|
||||
namespace yycc::panic {
|
||||
|
||||
void panic(const char* file, int line, const std::u8string_view& msg) {
|
||||
// Output message in stderr.
|
||||
@ -36,4 +36,4 @@ namespace yycc::rust::panic {
|
||||
std::abort();
|
||||
}
|
||||
|
||||
} // namespace yycc::rust::panic
|
||||
} // namespace yycc::panic
|
@ -1,5 +1,5 @@
|
||||
#pragma once
|
||||
#include "../patch/format.hpp"
|
||||
#include "patch/format.hpp"
|
||||
#include <string_view>
|
||||
#include <format>
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
* In this way, unexpected behavior in our code will cause the program to exit immediately, outputting error information and stack traces.
|
||||
* Standard library exceptions will also cause the program to exit, but without stack information.
|
||||
*/
|
||||
namespace yycc::rust::panic {
|
||||
namespace yycc::panic {
|
||||
|
||||
/**
|
||||
* @brief Immediately crashes the entire program like Rust's \c panic! macro.
|
||||
@ -31,7 +31,7 @@ namespace yycc::rust::panic {
|
||||
* However, this format function is specially modified that it can accept UTF8 format string and UTF8 string argument.
|
||||
* More preciously, it is "format" in \c yycc::patch::format namespace.
|
||||
*/
|
||||
#define RS_PANIC(msg, ...) ::yycc::rust::panic::panic(__FILE__, __LINE__, ::yycc::patch::format::format(msg __VA_OPT__(, ) __VA_ARGS__))
|
||||
#define RS_PANIC(msg, ...) ::yycc::panic::panic(__FILE__, __LINE__, ::yycc::patch::format::format(msg __VA_OPT__(, ) __VA_ARGS__))
|
||||
|
||||
/**
|
||||
* @brief Immediately crashes the entire program like Rust's \c panic! macro.
|
||||
@ -44,4 +44,4 @@ namespace yycc::rust::panic {
|
||||
*/
|
||||
[[noreturn]] void panic(const char* file, int line, const std::u8string_view& msg);
|
||||
|
||||
} // namespace yycc::rust::panic
|
||||
} // namespace yycc::panic
|
49
src/yycc/prelude.hpp
Normal file
49
src/yycc/prelude.hpp
Normal file
@ -0,0 +1,49 @@
|
||||
#pragma once
|
||||
|
||||
// Rust prelude section
|
||||
#include "primitive.hpp"
|
||||
#include "result.hpp"
|
||||
#include "option.hpp"
|
||||
#include "panic.hpp"
|
||||
#include <vector>
|
||||
|
||||
namespace yycc::prelude {
|
||||
// Include primitive types
|
||||
|
||||
#define NS_YYCC_PRIMITIVE ::yycc::primitive
|
||||
|
||||
using i8 = NS_YYCC_PRIMITIVE::i8;
|
||||
using i16 = NS_YYCC_PRIMITIVE::i16;
|
||||
using i32 = NS_YYCC_PRIMITIVE::i32;
|
||||
using i64 = NS_YYCC_PRIMITIVE::i64;
|
||||
using u8 = NS_YYCC_PRIMITIVE::u8;
|
||||
using u16 = NS_YYCC_PRIMITIVE::u16;
|
||||
using u32 = NS_YYCC_PRIMITIVE::u32;
|
||||
using u64 = NS_YYCC_PRIMITIVE::u64;
|
||||
|
||||
using isize = NS_YYCC_PRIMITIVE::isize;
|
||||
using usize = NS_YYCC_PRIMITIVE::usize;
|
||||
|
||||
using f32 = NS_YYCC_PRIMITIVE::f32;
|
||||
using f64 = NS_YYCC_PRIMITIVE::f64;
|
||||
|
||||
using str = NS_YYCC_PRIMITIVE::str;
|
||||
|
||||
#undef NS_YYCC_PRIMITIVE
|
||||
|
||||
// Other types
|
||||
using String = std::u8string;
|
||||
template<typename T>
|
||||
using Vec = std::vector<T>;
|
||||
|
||||
// Expose Result and Option
|
||||
using namespace ::yycc::option;
|
||||
using namespace ::yycc::result;
|
||||
|
||||
// Panic are introduced by including header file
|
||||
// so we do not need re-expose it.
|
||||
|
||||
} // namespace yycc::prelude
|
||||
|
||||
// Expose all members
|
||||
using namespace ::yycc::prelude;
|
@ -3,7 +3,7 @@
|
||||
#include <cstddef>
|
||||
#include <string_view>
|
||||
|
||||
namespace yycc::rust::primitive {
|
||||
namespace yycc::primitive {
|
||||
|
||||
// `bool` is keyword so should not declare it anymore.
|
||||
// `char` is keyword so should not declare it anymore.
|
||||
@ -25,4 +25,3 @@ namespace yycc::rust::primitive {
|
||||
|
||||
using str = std::u8string_view;
|
||||
}
|
||||
|
@ -36,7 +36,7 @@
|
||||
* Similarly, when using \c std::cerr 's \c operator<< overload, you also need to write suitable adapters.
|
||||
* @remarks This namespace only work with environment supporting `std::expected` (i.e. C++ 23).
|
||||
*/
|
||||
namespace yycc::rust::result {
|
||||
namespace yycc::result {
|
||||
|
||||
/**
|
||||
* @brief Equivalent Rust \c Result in C++
|
||||
@ -74,4 +74,4 @@ namespace yycc::rust::result {
|
||||
return ResultType(std::unexpect, std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
} // namespace yycc::rust::result
|
||||
} // namespace yycc::result
|
@ -1,49 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
// Rust prelude section
|
||||
#include "primitive.hpp"
|
||||
#include "result.hpp"
|
||||
#include "option.hpp"
|
||||
#include "panic.hpp"
|
||||
#include <vector>
|
||||
|
||||
namespace yycc::rust::prelude {
|
||||
// Include primitive types
|
||||
|
||||
#define NS_RUST_PRIMITIVE ::yycc::rust::primitive
|
||||
|
||||
using i8 = NS_RUST_PRIMITIVE::i8;
|
||||
using i16 = NS_RUST_PRIMITIVE::i16;
|
||||
using i32 = NS_RUST_PRIMITIVE::i32;
|
||||
using i64 = NS_RUST_PRIMITIVE::i64;
|
||||
using u8 = NS_RUST_PRIMITIVE::u8;
|
||||
using u16 = NS_RUST_PRIMITIVE::u16;
|
||||
using u32 = NS_RUST_PRIMITIVE::u32;
|
||||
using u64 = NS_RUST_PRIMITIVE::u64;
|
||||
|
||||
using isize = NS_RUST_PRIMITIVE::isize;
|
||||
using usize = NS_RUST_PRIMITIVE::usize;
|
||||
|
||||
using f32 = NS_RUST_PRIMITIVE::f32;
|
||||
using f64 = NS_RUST_PRIMITIVE::f64;
|
||||
|
||||
using str = NS_RUST_PRIMITIVE::str;
|
||||
|
||||
#undef NS_RUST_PRIMITIVE
|
||||
|
||||
// Other types
|
||||
using String = std::u8string;
|
||||
template<typename T>
|
||||
using Vec = std::vector<T>;
|
||||
|
||||
// Expose Result and Option
|
||||
using namespace ::yycc::rust::option;
|
||||
using namespace ::yycc::rust::result;
|
||||
|
||||
// Panic are introduced by including header file
|
||||
// so we do not need re-expose it.
|
||||
|
||||
} // namespace yycc::prelude::rust
|
||||
|
||||
// Expose all members
|
||||
using namespace ::yycc::rust::prelude;
|
9
src/yycc/string.hpp
Normal file
9
src/yycc/string.hpp
Normal file
@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
// TODO:
|
||||
// Add content safe, Rust-like string container "String"
|
||||
// and string view "str" in there.
|
||||
// Once we add it, all string process function can be migrated as their class member,
|
||||
// or keep them independendly but change the type of parameter into our string types.
|
||||
|
||||
namespace yycc::string {}
|
@ -20,7 +20,7 @@ PRIVATE
|
||||
yycc/patch/fopen.cpp
|
||||
yycc/patch/stream.cpp
|
||||
yycc/patch/format.cpp
|
||||
yycc/rust/env.cpp
|
||||
yycc/env.cpp
|
||||
yycc/string/reinterpret.cpp
|
||||
yycc/string/op.cpp
|
||||
yycc/num/parse.cpp
|
||||
|
@ -2,7 +2,7 @@
|
||||
#include <yycc.hpp>
|
||||
#include <yycc/constraint.hpp>
|
||||
|
||||
#include <yycc/rust/prelude.hpp>
|
||||
#include <yycc/prelude.hpp>
|
||||
|
||||
#define CONSTRAINT ::yycc::constraint::Constraint
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
#include <yycc.hpp>
|
||||
#include <yycc/constraint/builder.hpp>
|
||||
|
||||
#include <yycc/rust/prelude.hpp>
|
||||
#include <yycc/prelude.hpp>
|
||||
|
||||
#define BUILDER ::yycc::constraint::builder
|
||||
using namespace std::literals::string_view_literals;
|
||||
|
@ -1,17 +1,17 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <yycc.hpp>
|
||||
#include <yycc/rust/env.hpp>
|
||||
#include <yycc/env.hpp>
|
||||
#include <yycc/macro/os_detector.hpp>
|
||||
#include <filesystem>
|
||||
|
||||
#define ENV ::yycc::rust::env
|
||||
#define ENV ::yycc::env
|
||||
|
||||
namespace yycctest::rust::env {
|
||||
namespace yycctest::env {
|
||||
|
||||
constexpr char8_t VAR_NAME[] = u8"HOMER";
|
||||
constexpr char8_t VAR_VALUE[] = u8"doh";
|
||||
|
||||
TEST(RustEnv, EnvVar) {
|
||||
TEST(Env, EnvVar) {
|
||||
// Write a new variable should okey
|
||||
{
|
||||
auto rv = ENV::set_var(VAR_NAME, VAR_VALUE);
|
||||
@ -44,7 +44,7 @@ namespace yycctest::rust::env {
|
||||
}
|
||||
}
|
||||
|
||||
TEST(RustEnv, CurrentExe) {
|
||||
TEST(Env, CurrentExe) {
|
||||
auto rv = ENV::current_exe();
|
||||
ASSERT_TRUE(rv.has_value());
|
||||
|
||||
@ -59,4 +59,4 @@ namespace yycctest::rust::env {
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace yycctest::rust::env
|
||||
} // namespace yycctest::env
|
@ -3,7 +3,7 @@
|
||||
#include <yycc/flag_enum.hpp>
|
||||
#include <cinttypes>
|
||||
|
||||
#include <yycc/rust/prelude.hpp>
|
||||
#include <yycc/prelude.hpp>
|
||||
|
||||
#define FLAG_ENUM ::yycc::flag_enum
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
#include <yycc.hpp>
|
||||
#include <yycc/num/op.hpp>
|
||||
|
||||
#include <yycc/rust/prelude.hpp>
|
||||
#include <yycc/prelude.hpp>
|
||||
|
||||
#define OP ::yycc::num::op
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
#include <yycc.hpp>
|
||||
#include <yycc/num/parse.hpp>
|
||||
|
||||
#include <yycc/rust/prelude.hpp>
|
||||
#include <yycc/prelude.hpp>
|
||||
|
||||
#define PARSE ::yycc::num::parse
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
#include <yycc/num/safe_cast.hpp>
|
||||
#include <yycc/macro/ptr_size_detector.hpp>
|
||||
|
||||
#include <yycc/rust/prelude.hpp>
|
||||
#include <yycc/prelude.hpp>
|
||||
|
||||
#define CAST ::yycc::num::safe_cast
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
#include <cstdint>
|
||||
#include <limits>
|
||||
|
||||
#include <yycc/rust/prelude.hpp>
|
||||
#include <yycc/prelude.hpp>
|
||||
|
||||
#define OP ::yycc::num::safe_op
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
#include <yycc.hpp>
|
||||
#include <yycc/num/stringify.hpp>
|
||||
|
||||
#include <yycc/rust/prelude.hpp>
|
||||
#include <yycc/prelude.hpp>
|
||||
|
||||
#define STRINGIFY ::yycc::num::stringify
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
#include <yycc.hpp>
|
||||
#include <yycc/string/op.hpp>
|
||||
|
||||
#include <yycc/rust/prelude.hpp>
|
||||
#include <yycc/prelude.hpp>
|
||||
|
||||
#define OP ::yycc::string::op
|
||||
using namespace std::literals::string_view_literals;
|
||||
|
@ -3,7 +3,7 @@
|
||||
#include <yycc.hpp>
|
||||
#include <yycc/string/reinterpret.hpp>
|
||||
|
||||
#include <yycc/rust/prelude.hpp>
|
||||
#include <yycc/prelude.hpp>
|
||||
|
||||
#define REINTERPRET ::yycc::string::reinterpret
|
||||
#define AS_UINT8(p) static_cast<u8>(p)
|
||||
|
Reference in New Issue
Block a user