From c25e58ae17878e1a39c4196ae56cfb13afaf4903 Mon Sep 17 00:00:00 2001 From: wyc <1104749580@qq.com> Date: Mon, 29 Jun 2026 09:40:55 +0800 Subject: [PATCH] =?UTF-8?q?std::string=5Fview=20=E7=9A=84=E4=BD=BF?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Base/Check.cpp | 19 +- Core/Base/Check.h | 7 +- Core/Base/File_Helper.cpp | 22 +- Core/Base/File_Helper.h | 13 +- Core/Base/JSON.cpp | 52 ++-- Core/Base/JSON.h | 66 ++-- Core/Base/SM_RingBuffer.cpp | 22 +- Core/Base/SM_RingBuffer.h | 5 +- Core/Base/ThreadManager.cpp | 37 ++- Core/Base/ThreadManager.h | 11 +- Core/Net_Adapter/Net_Adapter_linux.cpp | 5 +- Core/Net_Adapter/Net_Adapter_win.cpp | 10 +- Core/Serial/Serial.cpp | 14 +- Core/Serial/Serial.h | 15 +- Core/Serial/Serial_Coro.h | 16 +- Core/Serial/Serial_linux.cpp | 5 +- Core/Serial/Serial_p.h | 3 +- Core/Serial/Serial_win.cpp | 11 +- Core/Shared_Memory/Shared_Memory.cpp | 12 +- Core/Shared_Memory/Shared_Memory.h | 11 +- Core/Shared_Memory/Shared_Memory_linux.cpp | 9 +- Core/Shared_Memory/Shared_Memory_win.cpp | 18 +- Core/Statistics/Frequency_Limit.h | 9 +- Core/socket/Socket.h | 3 +- Core/socket/Socket_Coro.h | 343 +++++++++------------ Core/socket/TCP_Client.cpp | 3 +- Core/socket/TCP_Client.h | 3 +- Core/socket/TCP_Server.cpp | 5 +- Core/socket/TCP_Server.h | 5 +- Core/socket/UDP_Client.cpp | 3 +- Core/socket/UDP_Client.h | 81 +++-- Core/socket/UDP_Server.cpp | 9 +- Core/socket/UDP_Server.h | 9 +- Core/spdlog/export.cpp | 58 ++-- Core/spdlog/export.h | 19 +- Core/system/export.cpp | 23 +- Core/system/export.h | 23 +- Core/system/linux.cpp | 21 +- Core/system/win.cpp | 28 +- psc_global_include/Bit.h | 26 +- 40 files changed, 532 insertions(+), 522 deletions(-) diff --git a/Core/Base/Check.cpp b/Core/Base/Check.cpp index 361b0bc..8fdec05 100644 --- a/Core/Base/Check.cpp +++ b/Core/Base/Check.cpp @@ -3,10 +3,11 @@ #include #include #include +#include bool check_port(long long port) { return port >= 0 && port <= 65535; } -bool check_ipv4(const std::string &ip) { - std::istringstream ss(ip); +bool check_ipv4(std::string_view ip) { + std::istringstream ss{std::string(ip)}; std::string segment; int count = 0; @@ -53,9 +54,9 @@ bool check_ipv4(const std::string &ip) { // return count == 4; // IPv4 应该有 4 个段 // } -unsigned int ip_to_int(const std::string &ip) { +unsigned int ip_to_int(std::string_view ip) { unsigned int result = 0; - std::stringstream ss(ip); + std::stringstream ss{std::string(ip)}; std::string byte; for (int i = 0; i < 4; ++i) { std::getline(ss, byte, '.'); @@ -65,8 +66,8 @@ unsigned int ip_to_int(const std::string &ip) { } // 判断 IP 地址是否在子网内 -bool is_in_subnet(const std::string &ip, const std::string &netmask, - const std::string &gateway) { +bool is_in_subnet(std::string_view ip, std::string_view netmask, + std::string_view gateway) { unsigned int ipInt = ip_to_int(ip); unsigned int netmaskInt = ip_to_int(netmask); unsigned int gatewayInt = ip_to_int(gateway); @@ -77,8 +78,8 @@ bool is_in_subnet(const std::string &ip, const std::string &netmask, } // check 函数,验证 IP、子网掩码和网关 -bool check_ip_netmask_gateway(const std::string &ip, const std::string &netmask, - const std::string &gateway) { +bool check_ip_netmask_gateway(std::string_view ip, std::string_view netmask, + std::string_view gateway) { // 验证 IP 地址、子网掩码和网关是否合法 if (!check_ipv4(ip)) { std::cerr << "Invalid IP address: " << ip << std::endl; @@ -166,4 +167,4 @@ TEST(CheckIPv4Test, InvalidIPv4Addresses) { // } // } -#endif \ No newline at end of file +#endif diff --git a/Core/Base/Check.h b/Core/Base/Check.h index 640067d..c900283 100644 --- a/Core/Base/Check.h +++ b/Core/Base/Check.h @@ -1,8 +1,9 @@ #pragma once +#include #include -bool check_ipv4(const std::string &ip); +bool check_ipv4(std::string_view ip); bool check_port(long long port); -bool check_ip_netmask_gateway(const std::string &ip, const std::string &netmask, - const std::string &gateway); \ No newline at end of file +bool check_ip_netmask_gateway(std::string_view ip, std::string_view netmask, + std::string_view gateway); \ No newline at end of file diff --git a/Core/Base/File_Helper.cpp b/Core/Base/File_Helper.cpp index 5ff17b9..dc92004 100644 --- a/Core/Base/File_Helper.cpp +++ b/Core/Base/File_Helper.cpp @@ -1,9 +1,10 @@ #include "File_Helper.h" #include "../system/export.h" +#include namespace Psc { -void File_Gather_Simple::init(const std::string &path, size_t size) { +void File_Gather_Simple::init(std::string_view path, size_t size) { this->buffer_size = size; abs_path = Psc::get_abs_path(path); @@ -19,7 +20,7 @@ void File_Gather_Simple::init(const std::string &path, size_t size) { buffer.reserve(buffer_size); } -File_Gather_Simple::File_Gather_Simple(const std::string &path, +File_Gather_Simple::File_Gather_Simple(std::string_view path, size_t buffer_size) { init(path, buffer_size); } @@ -51,16 +52,17 @@ void File_Gather_Simple::flush() { // 回放类 -File_Player::File_Player(const std::string &path) { open(path); } +File_Player::File_Player(std::string_view path) { open(path); } -void File_Player::open(const std::string &path) { +void File_Player::open(std::string_view path) { close(); + auto path_string = std::string(path); - total_size_ = std::filesystem::file_size(path); + total_size_ = std::filesystem::file_size(path_string); - ifs.open(path, std::ios::binary); + ifs.open(path_string, std::ios::binary); if (!ifs) - throw std::runtime_error("Failed to open file: " + path); + throw std::runtime_error("Failed to open file: " + path_string); } void File_Player::close() { @@ -112,9 +114,9 @@ double File_Player::progress() { static_cast(total_size_); } -File_Gather::File_Gather(const std::string &path, size_t buffer_size) +File_Gather::File_Gather(std::string_view path, size_t buffer_size) : gather_file(path, buffer_size) {} -void File_Gather::init(const std::string &path, size_t buffer_size) { +void File_Gather::init(std::string_view path, size_t buffer_size) { gather_file.init(path, buffer_size); } void File_Gather::append(const std::uint8_t *data, size_t size) { @@ -123,4 +125,4 @@ void File_Gather::append(const std::uint8_t *data, size_t size) { gather_file.append(data, size); } -} // namespace Psc \ No newline at end of file +} // namespace Psc diff --git a/Core/Base/File_Helper.h b/Core/Base/File_Helper.h index 8ef3789..1be23b5 100644 --- a/Core/Base/File_Helper.h +++ b/Core/Base/File_Helper.h @@ -1,4 +1,5 @@ #pragma once +#include #include "../system/export.h" #include "Core/Statistics/Statistics.h" @@ -18,8 +19,8 @@ namespace Psc { class File_Gather_Simple { public: File_Gather_Simple() = default; - void init(const std::string &path, size_t size); - File_Gather_Simple(const std::string &path, size_t buffer_size); + void init(std::string_view path, size_t size); + File_Gather_Simple(std::string_view path, size_t buffer_size); void append(const std::uint8_t *data, size_t size); ~File_Gather_Simple(); void flush(); @@ -34,8 +35,8 @@ private: class File_Player { public: File_Player() = default; - explicit File_Player(const std::string &path); - void open(const std::string &path); + explicit File_Player(std::string_view path); + void open(std::string_view path); void close(); size_t read(std::uint8_t *buffer, size_t size); [[nodiscard]] bool eof() const; @@ -54,8 +55,8 @@ class File_Gather { public: File_Gather() = default; ~File_Gather() = default; - File_Gather(const std::string &path, size_t buffer_size); - void init(const std::string &path, size_t buffer_size); + File_Gather(std::string_view path, size_t buffer_size); + void init(std::string_view path, size_t buffer_size); void append(const std::uint8_t *data, size_t size); void flush() { gather_file.flush(); } Speed_Statistics append_speed; diff --git a/Core/Base/JSON.cpp b/Core/Base/JSON.cpp index f81ace5..37601da 100644 --- a/Core/Base/JSON.cpp +++ b/Core/Base/JSON.cpp @@ -6,9 +6,9 @@ #define HANDLE_ERROR(reason) \ JSON::handle_error(__func__, reason, __FILE__, __LINE__); namespace Psc { -std::function +std::function JSON::handle_error = [](const char *function_name, - const std::string& reason, const char *file, + std::string_view reason, const char *file, int line) { std::ostringstream oss; oss << "JSON::" << function_name << " 原因:" << reason << std::endl; @@ -34,7 +34,7 @@ JSON::operator std::string() const { } PSC_DEFINE_TRIPLE_API_CONST_METHOD_FROM_BOOL(std::string, JSON, get_string, PSC_JSON_KEY_PARAMS) -bool JSON::get_string_ec(const std::string& key, std::string& out, +bool JSON::get_string_ec(std::string_view key, std::string& out, std::error_code& ec) const noexcept { const JSON *that = get(key); if (!that) { @@ -56,7 +56,7 @@ bool JSON::bool_val_ec(bool& out, std::error_code& ec) const noexcept { } PSC_DEFINE_TRIPLE_API_CONST_METHOD_FROM_BOOL(bool, JSON, get_bool, PSC_JSON_KEY_PARAMS) -bool JSON::get_bool_ec(const std::string& key, bool& out, +bool JSON::get_bool_ec(std::string_view key, bool& out, std::error_code& ec) const noexcept { const Psc::JSON *that = get(key); if (!that) { @@ -65,7 +65,7 @@ bool JSON::get_bool_ec(const std::string& key, bool& out, } return that->bool_val_ec(out, ec); } -JSON::JSON(std::string key, const JSON& children) : key(std::move(key)), val(children.val), valueType(children.valueType), +JSON::JSON(std::string_view key, const JSON& children) : key(key), val(children.val), valueType(children.valueType), children(children.children) {} void JSON::append_list(const std::vector& arr) { #ifdef _DEBUG @@ -99,7 +99,7 @@ void JSON::prepend(const JSON& json) { #endif children.insert(children.begin(), json); } -bool JSON::has(const std::string& _key) const { +bool JSON::has(std::string_view _key) const { for (const JSON& child : children) { if (child.key == _key) { return true; @@ -107,7 +107,7 @@ bool JSON::has(const std::string& _key) const { } return false; } -const JSON* JSON::get(const std::string& _key) const { +const JSON* JSON::get(std::string_view _key) const { for (const JSON& child : children) { if (child.key == _key) { return &child; @@ -122,21 +122,21 @@ JSON JSON::array(const std::vector& children) { JSON JSON::object(const std::vector& children) { return object("", children); } -JSON JSON::array(std::string key, const std::vector& children) { +JSON JSON::array(std::string_view key, const std::vector& children) { JSON ret; - ret.key = std::move(key); + ret.key = std::string(key); ret.valueType = Array; ret.children = children; return ret; } -JSON JSON::object(std::string key, const std::vector& children) { +JSON JSON::object(std::string_view key, const std::vector& children) { JSON ret; - ret.key = std::move(key); + ret.key = std::string(key); ret.valueType = Object; ret.children = children; return ret; } -std::string JSON::get_indent(const int& indent, const std::string& indentStr) { +std::string JSON::get_indent(const int& indent, std::string_view indentStr) { std::string ret; for (int i = 0; i < indent; ++i) { ret.append(indentStr); @@ -144,13 +144,13 @@ std::string JSON::get_indent(const int& indent, const std::string& indentStr) { return ret; } void JSON::append_value_string(std::string& ret, const int& indent, bool isEnd, - const std::string& object_split, - const std::string& array_split, - const std::string& indentStr, + std::string_view object_split, + std::string_view array_split, + std::string_view indentStr, JsonType fatherType) const { ret.append(get_indent(indent, indentStr)); if (fatherType == Object) ret.append("\"" + key + "\"" + ": "); - const std::string split = fatherType == Array ? array_split : object_split; + const std::string split = std::string(fatherType == Array ? array_split : object_split); if (valueType == String) { ret.append("\"" + val + "\""); goto end; @@ -164,7 +164,8 @@ void JSON::append_value_string(std::string& ret, const int& indent, bool isEnd, goto end; } if (valueType == Object) { - ret.append("{" + object_split); + ret.append("{"); + ret.append(object_split); size_t n = children.size(); if (n) { for (size_t i = 0; i < n - 1; ++i) { @@ -178,7 +179,8 @@ void JSON::append_value_string(std::string& ret, const int& indent, bool isEnd, goto end; } if (valueType == Array) { - ret.append("[" + array_split); + ret.append("["); + ret.append(array_split); size_t n = children.size(); if (n) { for (size_t i = 0; i < n - 1; ++i) { @@ -207,9 +209,9 @@ void handleBlank(std::string& s) { } } } -std::string JSON::to_json_string(const std::string& object_split, - const std::string& array_split, - const std::string& indentStr, +std::string JSON::to_json_string(std::string_view object_split, + std::string_view array_split, + std::string_view indentStr, const int& indent) const { if (valueType == Bool) return val; if (valueType == String) return '\"' + val + '\"'; @@ -317,9 +319,9 @@ bool parse_number(std::string& s, size_t& i, std::string& out, bool parse_json_EX(std::string& s, size_t& i, JSON& out, std::error_code& ec) noexcept; PSC_DEFINE_TRIPLE_API_FROM_BOOL(JSON, parse_json, PSC_JSON_PARSE_PARAMS) -bool parse_json_ec(const std::string& text, JSON& out, +bool parse_json_ec(std::string_view text, JSON& out, std::error_code& ec) noexcept { - auto& t = const_cast(text); + auto t = std::string(text); size_t i = 0; return parse_json_EX(t, i, out, ec); } @@ -445,9 +447,9 @@ bool parse_array(std::string& s, size_t& i, JSON& out, return true; } PSC_DEFINE_TRIPLE_API_FROM_BOOL(JSON, parse_json_file, PSC_JSON_FILE_PARAMS) -bool parse_json_file_ec(const std::string& file_name, JSON& out, +bool parse_json_file_ec(std::string_view file_name, JSON& out, std::error_code& ec) noexcept { - auto readFile = [](const std::string& path, std::string& content, + auto readFile = [](std::string_view path, std::string& content, std::error_code& ec) noexcept { std::ifstream infile(path, std::ios::binary | std::ios::ate); if (!infile.is_open()) { diff --git a/Core/Base/JSON.h b/Core/Base/JSON.h index e12c4c5..d4fd156 100644 --- a/Core/Base/JSON.h +++ b/Core/Base/JSON.h @@ -7,14 +7,15 @@ #include // std::numeric_limits #include #include +#include #include -#define PSC_JSON_KEY_PARAMS(M, SEP) M(const std::string &, key) -#define PSC_JSON_PARSE_PARAMS(M, SEP) M(const std::string &, text) -#define PSC_JSON_FILE_PARAMS(M, SEP) M(const std::string &, file_name) +#define PSC_JSON_KEY_PARAMS(M, SEP) M(std::string_view, key) +#define PSC_JSON_PARSE_PARAMS(M, SEP) M(std::string_view, text) +#define PSC_JSON_FILE_PARAMS(M, SEP) M(std::string_view, file_name) #undef max #undef min #define Json_GET(type, name) \ - [[nodiscard]] type get_##name(const std::string &_key) const { \ + [[nodiscard]] type get_##name(std::string_view _key) const { \ const Psc::JSON *that = get(_key); \ if (!that) { \ std::cout << "get" #type " error json not found! key:" << _key \ @@ -38,10 +39,10 @@ enum JsonType : uint8_t { String, Object, Array, Null, Number, Bool }; template void assign_json(JsonType& rt, std::string& rv, T&& val); template -bool to_number_ec(const std::string& val, T_Number& out, +bool to_number_ec(std::string_view val, T_Number& out, std::error_code& ec) noexcept; template -T_Number to_number(const std::string& val) { +T_Number to_number(std::string_view val) { return detail::triple_api_throwing( [&val](T_Number& out, std::error_code& ec) { return to_number_ec(val, out, ec); @@ -49,14 +50,14 @@ T_Number to_number(const std::string& val) { "to_number failed"); } template -expected try_to_number(const std::string& val) noexcept { +expected try_to_number(std::string_view val) noexcept { return detail::triple_api_expected( [&val](T_Number& out, std::error_code& ec) { return to_number_ec(val, out, ec); }); } template -bool to_number_ec(const std::string& val, T_Number& out, +bool to_number_ec(std::string_view val, T_Number& out, std::error_code& ec) noexcept { ec.clear(); // 限定只支持整数/浮点,其他类型编译期报错(比运行时返回默认值更安全) @@ -68,7 +69,8 @@ bool to_number_ec(const std::string& val, T_Number& out, if constexpr (std::is_integral_v) { if constexpr (std::is_unsigned_v) { // stoull: 负号、非数字等会抛 invalid_argument;超范围抛 out_of_range - unsigned long long x = std::stoull(val); + auto text = std::string(val); + unsigned long long x = std::stoull(text); // 额外范围检查,避免静默截断 if (x > static_cast( std::numeric_limits::max())) { @@ -79,7 +81,8 @@ bool to_number_ec(const std::string& val, T_Number& out, return true; } else { - long long x = std::stoll(val); + auto text = std::string(val); + long long x = std::stoll(text); // 额外范围检查,避免静默截断 if (x < static_cast(std::numeric_limits::min()) || x > static_cast(std::numeric_limits::max())) { @@ -92,7 +95,8 @@ bool to_number_ec(const std::string& val, T_Number& out, } else { // floating point - long double x = std::stold(val); + auto text = std::string(val); + long double x = std::stold(text); // 可选:检查是否超出目标浮点类型范围 if (x < -static_cast(std::numeric_limits::max()) || x > static_cast(std::numeric_limits::max())) { @@ -114,19 +118,19 @@ bool to_number_ec(const std::string& val, T_Number& out, } class JSON { public: - static std::function handle_error; explicit operator std::string() const; friend std::ostream& operator<<(std::ostream& os, const JSON& obj); - [[nodiscard]] bool has(const std::string& key) const; - [[nodiscard]] const JSON* get(const std::string& key) const; + [[nodiscard]] bool has(std::string_view key) const; + [[nodiscard]] const JSON* get(std::string_view key) const; PSC_DECLARE_TRIPLE_API_CONST_METHOD(std::string, get_string, PSC_JSON_KEY_PARAMS); PSC_DECLARE_TRIPLE_API_CONST_METHOD_0(bool, bool_val); PSC_DECLARE_TRIPLE_API_CONST_METHOD(bool, get_bool, PSC_JSON_KEY_PARAMS); template - T_Number get_number(const std::string& key) const { + T_Number get_number(std::string_view key) const { return detail::triple_api_throwing( [this, &key](T_Number& out, std::error_code& ec) { return get_number_ec(key, out, ec); @@ -134,14 +138,14 @@ public: "get_number failed"); } template - expected try_get_number(const std::string& key) const noexcept { + expected try_get_number(std::string_view key) const noexcept { return detail::triple_api_expected( [this, &key](T_Number& out, std::error_code& ec) { return get_number_ec(key, out, ec); }); } template - bool get_number_ec(const std::string& key, T_Number& out, + bool get_number_ec(std::string_view key, T_Number& out, std::error_code& ec) const noexcept { const JSON *that = get(key); if (!that) { @@ -173,11 +177,11 @@ public: } return to_number_ec(val, out, ec); } - JSON(std::string key, const JSON& body); + JSON(std::string_view key, const JSON& body); template , JSON>>> - JSON(std::string k, T&& v) { - key = std::move(k); + JSON(std::string_view k, T&& v) { + key = std::string(k); assign_json(valueType, val, std::forward(v)); } template & arr); void append(const JSON& json); void prepend(const JSON& json); - static JSON array(std::string key, const std::vector& arr); - static JSON object(std::string key, const std::vector& children); + static JSON array(std::string_view key, const std::vector& arr); + static JSON object(std::string_view key, const std::vector& children); static JSON array(const std::vector& arr = {}); static JSON object(const std::vector& children = {}); JsonType valueType = Null; std::string key, val; std::vector children; - [[nodiscard]] std::string to_json_string(const std::string& object_split = "\n", - const std::string& array_split = "\n", - const std::string& indentStr = " ", + [[nodiscard]] std::string to_json_string(std::string_view object_split = "\n", + std::string_view array_split = "\n", + std::string_view indentStr = " ", const int& indent = 0) const; private: static std::string get_indent(const int& indent, - const std::string& indentStr); + std::string_view indentStr); void append_value_string(std::string& ret, const int& indent, bool isEnd, - const std::string& object_split, - const std::string& array_split, - const std::string& indentStr, + std::string_view object_split, + std::string_view array_split, + std::string_view indentStr, JsonType fatherType) const; }; PSC_DECLARE_TRIPLE_API(JSON, parse_json, PSC_JSON_PARSE_PARAMS); @@ -224,6 +228,10 @@ void assign_json(JsonType& rt, std::string& rv, T&& v) { rt = String; rv = std::forward(v); } + else if constexpr (std::is_same_v) { + rt = String; + rv = std::string(v); + } else if constexpr (std::is_same_v) { std::stringstream ss; ss << "0x" << std::setw(sizeof(void*) * 2) << std::setfill('0') << std::hex diff --git a/Core/Base/SM_RingBuffer.cpp b/Core/Base/SM_RingBuffer.cpp index 18bc621..f04be3c 100644 --- a/Core/Base/SM_RingBuffer.cpp +++ b/Core/Base/SM_RingBuffer.cpp @@ -3,6 +3,7 @@ #include "Core/Base/global_include.h" #include "Core/spdlog/export.h" #include "Core/transmit_protocol/Channel_Simulator/global.h" +#include namespace Psc { // 1. used_space 简化:利用无符号溢出特性或 mask @@ -32,13 +33,14 @@ void SM_Base_RingBuffer::rollback(size_t n) { // (head - n) 可能产生负数溢出,但在无符号下配合 mask 是正确的 state->head = (state->head - n) & mask; } -SM_Base_RingBuffer::SM_Base_RingBuffer(const std::string &name, size_t size) { +SM_Base_RingBuffer::SM_Base_RingBuffer(std::string_view name, size_t size) { init(name, size); } -void SM_Base_RingBuffer::init(const std::string &name, size_t size) { - data_mutex.init(name + "_data_mutex"); - create_mutex.init(name + "_create_mutex"); +void SM_Base_RingBuffer::init(std::string_view name, size_t size) { + auto name_string = std::string(name); + data_mutex.init(name_string + "_data_mutex"); + create_mutex.init(name_string + "_create_mutex"); std::lock_guard lock(create_mutex); // --- 修改点 1: 确保数据区本身是 2 的幂 --- @@ -47,18 +49,18 @@ void SM_Base_RingBuffer::init(const std::string &name, size_t size) { bool ok; std::ostringstream oss; - bool open = check_if_shared_memory_exists(name); + bool open = check_if_shared_memory_exists(name_string); if (open) { // 注意:打开时也要使用计算出的 total_alloc_size - oss << "【打开共享内存】" << VAR_STR_3(name, total_alloc_size, size) + oss << "【打开共享内存】" << VAR_STR_3(name_string, total_alloc_size, size) << std::endl; - ok = shm.open(name, total_alloc_size); + ok = shm.open(name_string, total_alloc_size); create = false; } else { - oss << "【创建共享内存】" << VAR_STR_3(name, total_alloc_size, size) + oss << "【创建共享内存】" << VAR_STR_3(name_string, total_alloc_size, size) << std::endl; - ok = shm.create(name, total_alloc_size); + ok = shm.create(name_string, total_alloc_size); create = true; } @@ -269,4 +271,4 @@ size_t SM_Stream_RingBuffer::read_best_effort(uint8_t *out, size_t max_len) { // // } -#endif \ No newline at end of file +#endif diff --git a/Core/Base/SM_RingBuffer.h b/Core/Base/SM_RingBuffer.h index 2ad3e30..4da9fec 100644 --- a/Core/Base/SM_RingBuffer.h +++ b/Core/Base/SM_RingBuffer.h @@ -1,6 +1,7 @@ #ifndef PLANTSUNCAT_SM_BLOCK_RINGBUFFER_H #define PLANTSUNCAT_SM_BLOCK_RINGBUFFER_H #include "../Shared_Memory/Shared_Memory.h" +#include namespace Psc { @@ -11,9 +12,9 @@ public: alignas(64) size_t head; alignas(64) size_t tail; }; - void init(const std::string &name, size_t size); + void init(std::string_view name, size_t size); SM_Base_RingBuffer(); - SM_Base_RingBuffer(const std::string &name, size_t alloc_size); + SM_Base_RingBuffer(std::string_view name, size_t alloc_size); [[nodiscard]] bool empty() const; [[nodiscard]] bool full() const; ~SM_Base_RingBuffer(); diff --git a/Core/Base/ThreadManager.cpp b/Core/Base/ThreadManager.cpp index 1930c6a..91c028c 100644 --- a/Core/Base/ThreadManager.cpp +++ b/Core/Base/ThreadManager.cpp @@ -3,25 +3,27 @@ #include #include "../system/export.h" +#include using namespace std::chrono; -void Detach_Thread_Manager::start_thread(const std::string& name, const std::function&)>& f) { - auto iter = thread_map.find(name); +void Detach_Thread_Manager::start_thread(std::string_view name, const std::function&)>& f) { + auto name_string = std::string(name); + auto iter = thread_map.find(name_string); if (iter == thread_map.end()) { - auto t = new Detach_Thread(name, [f, name, this](std::atomic& running) { + auto t = new Detach_Thread(name_string, [f, name_string, this](std::atomic& running) { { std::ostringstream oss; - oss << "\t" + name + "线程[id:" << std::this_thread::get_id() << "] 启动!\n"; + oss << "\t" + name_string + "线程[id:" << std::this_thread::get_id() << "] 启动!\n"; std::cout << oss.str() << std::flush; } f(running); { std::ostringstream oss; - oss << " 【" + name + "】 线程 "; + oss << " 【" + name_string + "】 线程 "; auto end = std::chrono::high_resolution_clock::now(); auto duration = duration_cast(end - exit_time); // 转换为毫秒 oss << "耗时: " + std::to_string(duration.count()) + " 毫秒" + " 退出! " @@ -29,18 +31,19 @@ void Detach_Thread_Manager::start_thread(const std::string& name, const std::fun std::cout << oss.str() << std::endl; } }); - thread_map[name] = t; + thread_map[name_string] = t; t->start(); } else { std::cerr << "Detach_Thread_Manager append_thread error! Thread " << name << " already exists." << std::endl; } } -void Detach_Thread_Manager::exit_thread(const std::string& name) { +void Detach_Thread_Manager::exit_thread(std::string_view name) { + auto name_string = std::string(name); bool ok = false; for (auto it = thread_map.begin(); it != thread_map.end(); it++) { - if (it->first == name) + if (it->first == name_string) { auto t = it->second; t->running.store(false, std::memory_order_release); @@ -48,7 +51,7 @@ void Detach_Thread_Manager::exit_thread(const std::string& name) { { // 等待所有线程退出 } - std::cout << "\t" + name + "线程关闭!\n"; + std::cout << "\t" + name_string + "线程关闭!\n"; delete it->second; thread_map.erase(it); ok = true; @@ -59,10 +62,10 @@ void Detach_Thread_Manager::exit_thread(const std::string& name) { { } } -Detach_Thread::Detach_Thread(const std::string &name, const std::function &running)> &func) { - this->name = name; - thread = std::thread([func, this, name]() { - Psc::set_current_thread_name(name); +Detach_Thread::Detach_Thread(std::string_view name, const std::function &running)> &func) { + this->name = std::string(name); + thread = std::thread([func, this, name_string = this->name]() { + Psc::set_current_thread_name(name_string); func(running); // 标志守护函数已经退出 this->exit.store(true, std::memory_order_release); @@ -71,15 +74,15 @@ Detach_Thread::Detach_Thread(const std::string &name, const std::function &running)> &func) { - if (thread_map.find(name) == thread_map.end()) + if (thread_map.find(std::string(name)) == thread_map.end()) { start_thread(name, func); } } -void Detach_Thread_Manager::test_and_stop_thread(const std::string &name) { - if (thread_map.find(name) != thread_map.end()) +void Detach_Thread_Manager::test_and_stop_thread(std::string_view name) { + if (thread_map.find(std::string(name)) != thread_map.end()) { exit_thread(name); } diff --git a/Core/Base/ThreadManager.h b/Core/Base/ThreadManager.h index 6526c69..accd18d 100644 --- a/Core/Base/ThreadManager.h +++ b/Core/Base/ThreadManager.h @@ -1,4 +1,5 @@ #pragma once +#include #include "Core/Statistics/Frequency_Limit.h" #include @@ -12,7 +13,7 @@ struct Detach_Thread { explicit Detach_Thread( - const std::string &name, + std::string_view name, const std::function &running)> &func); void start(); std::string name; @@ -23,9 +24,9 @@ struct Detach_Thread { struct Detach_Thread_Manager { Detach_Thread_Manager() = default; void test_and_start_thread( - const std::string &name, + std::string_view name, const std::function &running)> &func); - void test_and_stop_thread(const std::string &name); + void test_and_stop_thread(std::string_view name); void stop_all_thread(size_t timeout_milliseconds = 10000, std::set excluded_thread = {}); Detach_Thread *get_thread(const std::thread::id thread_id); @@ -33,8 +34,8 @@ struct Detach_Thread_Manager { protected: Frequency_Limit fl; std::map thread_map; - void exit_thread(const std::string &name); - void start_thread(const std::string &name, + void exit_thread(std::string_view name); + void start_thread(std::string_view name, const std::function &)> &f); std::chrono::time_point exit_time; }; diff --git a/Core/Net_Adapter/Net_Adapter_linux.cpp b/Core/Net_Adapter/Net_Adapter_linux.cpp index d4b04d9..66feeed 100644 --- a/Core/Net_Adapter/Net_Adapter_linux.cpp +++ b/Core/Net_Adapter/Net_Adapter_linux.cpp @@ -22,11 +22,12 @@ #include #include #include +#include namespace Psc { // 获取指定 IP 地址的网关(下一跳) // 参数 is_ipv6 为 true 则查询 IPv6 路由表,false 查询 IPv4 -std::string get_gateway_for_ip(const std::string &ip_str, +std::string get_gateway_for_ip(std::string_view ip_str, bool is_ipv6 = false) { // 创建 Netlink 套接字 int sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); @@ -133,7 +134,7 @@ std::string get_gateway_for_ip(const std::string &ip_str, return "Gateway not found"; } -std::string hexToIp(const std::string &hex) { +std::string hexToIp(std::string_view hex) { auto t = hex2mem(hex); auto ret = platform_2_big_endian((char *)t.data(), t.size()); return std::to_string((unsigned char)ret[0]) + "." + diff --git a/Core/Net_Adapter/Net_Adapter_win.cpp b/Core/Net_Adapter/Net_Adapter_win.cpp index 04d5ff6..f1e8d86 100644 --- a/Core/Net_Adapter/Net_Adapter_win.cpp +++ b/Core/Net_Adapter/Net_Adapter_win.cpp @@ -11,16 +11,18 @@ #include #include #include "Net_Adapter.h" +#include template -static std::string str_format(const std::string &format, Args... args) { - auto size_buf = std::snprintf(nullptr, 0, format.c_str(), args...) + 1; +static std::string str_format(std::string_view format, Args... args) { + auto format_string = std::string(format); + auto size_buf = std::snprintf(nullptr, 0, format_string.c_str(), args...) + 1; std::unique_ptr buf(new (std::nothrow) char[size_buf]); if (!buf) return ""; - std::snprintf(buf.get(), size_buf, format.c_str(), args...); + std::snprintf(buf.get(), size_buf, format_string.c_str(), args...); return std::string(buf.get(), buf.get() + size_buf - 1); } namespace Psc { @@ -144,4 +146,4 @@ std::map get_net_adapter_info_map() { } } // namespace Psc -#endif \ No newline at end of file +#endif diff --git a/Core/Serial/Serial.cpp b/Core/Serial/Serial.cpp index ad9c6a5..a9def13 100644 --- a/Core/Serial/Serial.cpp +++ b/Core/Serial/Serial.cpp @@ -3,16 +3,18 @@ #include "Serial_p.h" #include #include +#include -void serial_log(Log_Type &log_type, const std::string &MSG) { +void serial_log(Log_Type &log_type, std::string_view MSG) { Frequency_Limit_Multi lm; bool ok = lm.test(std::to_string(Psc::get_error_code())); if (!ok) return; std::ostringstream oss; + BaseLogger::Log_Info info{true, spdlog::level::debug, "", log_type, std::string(MSG)}; oss << Psc::get_error_message() - << BaseLogger::to_log({true, spdlog::level::debug, "", log_type, MSG}) + << BaseLogger::to_log(info) << std::endl; if (!Psc::serial::serial_logger) { std::cout << oss.str() << std::endl; @@ -90,8 +92,8 @@ void Serial::close() { fd = INVALID_HANDLE_VALUE; } -int64_t Serial::write(const std::string &data) { - return serial::write(fd, data.c_str(), data.size()); +int64_t Serial::write(std::string_view data) { + return serial::write(fd, data.data(), data.size()); } std::string Serial::read(int64_t size) { return read_all(fd); } @@ -117,7 +119,7 @@ std::string Serial::to_string() { return oss.str(); } -void Serial::set_serial_name(const std::string &serial_name) { +void Serial::set_serial_name(std::string_view serial_name) { this->serial_name = serial_name; } @@ -222,7 +224,7 @@ bool noblock_error() { #endif } -int64_t write_all(Serial_FD fd, const std::string &data, int64_t chunkSize, +int64_t write_all(Serial_FD fd, std::string_view data, int64_t chunkSize, int64_t milliseconds, int64_t retry_count) { int64_t total_written = 0; int64_t data_size = static_cast(data.size()); diff --git a/Core/Serial/Serial.h b/Core/Serial/Serial.h index bd07e1a..71a0a10 100644 --- a/Core/Serial/Serial.h +++ b/Core/Serial/Serial.h @@ -1,4 +1,5 @@ #pragma once +#include #include #include #include @@ -51,7 +52,7 @@ extern BaseLogger *serial_logger; void set_buffer_byte_size(Serial_FD fd, int byte_size); int get_buffer_byte_size(Serial_FD fd); void set_binary_mode(Serial_Settings &serial_info); -Serial_FD open(const std::string &port_name); +Serial_FD open(std::string_view port_name); void close(Serial_FD fd); void set_block(Serial_FD fd, bool block); Serial_Settings get_serial_info(Serial_FD fd); @@ -67,21 +68,21 @@ std::string read_block_all(Serial_FD fd, int64_t chunkSize); int64_t write(Serial_FD fd, const char *data, int64_t size); // milliseconds == 0 代表非阻塞 最快直接返回 -int64_t write_all(Serial_FD fd, const std::string &data, int64_t chunkSize, +int64_t write_all(Serial_FD fd, std::string_view data, int64_t chunkSize, int64_t milliseconds, int64_t retry_count); -inline int64_t write_all_noblock(Serial_FD fd, const std::string &data, +inline int64_t write_all_noblock(Serial_FD fd, std::string_view data, int64_t chunkSize) { return write_all(fd, data, chunkSize, 0, 0); } -inline int64_t write_all_block(Serial_FD fd, const std::string &data, +inline int64_t write_all_block(Serial_FD fd, std::string_view data, int64_t chunkSize) { return write_all(fd, data, chunkSize, 1, -1); } void set_baud_rate(Serial_Settings &serial_info, Serial_FD fd, Baud_Rate_Type baud); Baud_Rate_Type get_baud_rate(Serial_Settings &serial_info); -std::string get_serial_info_str(std::string serial_name); +std::string get_serial_info_str(std::string_view serial_name); enum class DataBits { Data5 = 5, @@ -129,7 +130,7 @@ class Serial { public: bool open(); void close(); - int64_t write(const std::string &data); + int64_t write(std::string_view data); std::string read(int64_t size = -1); int get_available_bytes(); @@ -146,7 +147,7 @@ protected: public: std::string to_string(); - void set_serial_name(const std::string &serial_name); + void set_serial_name(std::string_view serial_name); std::string get_serial_name(); void set_baud_rate(Baud_Rate_Type baud_rate); Baud_Rate_Type get_baud_rate(); diff --git a/Core/Serial/Serial_Coro.h b/Core/Serial/Serial_Coro.h index f6d21b4..d4c137d 100644 --- a/Core/Serial/Serial_Coro.h +++ b/Core/Serial/Serial_Coro.h @@ -1,4 +1,5 @@ #pragma once +#include #include "Serial.h" #include @@ -60,7 +61,7 @@ public: co_return read_impl(max_size); } - [[nodiscard]] asio::awaitable write_coro(std::string data) { + [[nodiscard]] asio::awaitable write_coro(std::string_view data) { co_return write_impl(data); } @@ -70,7 +71,7 @@ public: return read_impl(max_size); } - int64_t write(const std::string &data) { + int64_t write(std::string_view data) { return static_cast(write_impl(data)); } @@ -102,7 +103,7 @@ private: return data; } - std::size_t write_impl(const std::string &data) { + std::size_t write_impl(std::string_view data) { tick(); if (!port_ || !port_->is_open() || data.empty()) { return 0; @@ -112,13 +113,14 @@ private: return ec ? 0 : size; } - static std::string normalize_port_name(std::string port_name) { + static std::string normalize_port_name(std::string_view port_name) { + std::string ret(port_name); #ifdef _WIN32 - if (port_name.rfind("\\\\.\\", 0) != 0) { - port_name = "\\\\.\\" + port_name; + if (ret.rfind("\\\\.\\", 0) != 0) { + ret = "\\\\.\\" + ret; } #endif - return port_name; + return ret; } void apply_options(asio::error_code &ec) { diff --git a/Core/Serial/Serial_linux.cpp b/Core/Serial/Serial_linux.cpp index a007923..f702ef6 100644 --- a/Core/Serial/Serial_linux.cpp +++ b/Core/Serial/Serial_linux.cpp @@ -1,4 +1,5 @@ #include +#include #ifdef __linux__ #include "Serial_p.h" #include @@ -216,7 +217,7 @@ std::optional value_to_baud(const long baud_rate) { -std::string get_serial_info_str(std::string serial_name) { +std::string get_serial_info_str(std::string_view serial_name) { Serial serial; serial.set_serial_name(std::move(serial_name)); serial.open(); @@ -225,7 +226,7 @@ std::string get_serial_info_str(std::string serial_name) { return ret; } -int open(const std::string& serial_name) { +int open(std::string_view serial_name) { // 打开串口设备 O_RDWR | O_NOCTTY | O_CLOEXEC Serial_FD fd = ::open(serial_name.c_str(), O_RDWR | O_NOCTTY | O_CLOEXEC); // O_RDWR: 可读可写, O_NOCTTY: 不设置为控制终端, O_NDELAY: 非阻塞 if (fd == -1) { diff --git a/Core/Serial/Serial_p.h b/Core/Serial/Serial_p.h index c45e78c..a73c0b3 100644 --- a/Core/Serial/Serial_p.h +++ b/Core/Serial/Serial_p.h @@ -1,9 +1,10 @@ #pragma once +#include #include "../../Core/spdlog/export.h" #include "Serial.h" -void serial_log(Log_Type &log_type, const std::string &MSG); +void serial_log(Log_Type &log_type, std::string_view MSG); #define LOG_ERROR(MSG) \ static Log_Type log_type({}, {{"POS", LOG_POS}}); \ diff --git a/Core/Serial/Serial_win.cpp b/Core/Serial/Serial_win.cpp index 4d75463..0d721a6 100644 --- a/Core/Serial/Serial_win.cpp +++ b/Core/Serial/Serial_win.cpp @@ -1,6 +1,7 @@ #ifdef WIN32 #include "../Base/global_include.h" #include "Serial_p.h" +#include namespace Psc::serial { void reset(Serial_Settings &serial_info) { @@ -46,16 +47,18 @@ void set_binary_mode(Serial_Settings &serial_info) { // windows下默认就是 } -HANDLE open(const std::string &port_name) { +HANDLE open(std::string_view port_name) { + auto port_path = "\\\\.\\" + std::string(port_name); HANDLE hSerial = - CreateFile(("\\\\.\\" + port_name).c_str(), GENERIC_READ | GENERIC_WRITE, + CreateFile(port_path.c_str(), GENERIC_READ | GENERIC_WRITE, 0, // No sharing NULL, // Default security attributes OPEN_EXISTING, // Open the existing port 0, // 0 : No overlapped I/O FILE_FLAG_OVERLAPPED是异步 NULL); // No template file if (hSerial == INVALID_HANDLE_VALUE) { - LOG_ERROR(VAR_STR_1(port_name)) + auto port_name_string = std::string(port_name); + LOG_ERROR(VAR_STR_1(port_name_string)) Psc::fail_fast(); return INVALID_HANDLE_VALUE; } @@ -541,4 +544,4 @@ FlowControl get_flow_control(DCB &serial_info) { // CloseHandle(overlapped.hEvent); // return -1; // } -// } \ No newline at end of file +// } diff --git a/Core/Shared_Memory/Shared_Memory.cpp b/Core/Shared_Memory/Shared_Memory.cpp index 6730be4..6d7ddd8 100644 --- a/Core/Shared_Memory/Shared_Memory.cpp +++ b/Core/Shared_Memory/Shared_Memory.cpp @@ -5,24 +5,26 @@ #include "Core/transmit_protocol/Channel_Simulator/global.h" #include +#include namespace Psc { - Pure_Share_Memory::Pure_Share_Memory(const std::string &name, size_t alloc_size) { - mutex.init("Pure_Share_Memory_" + name + "_mutex"); - bool open = check_if_shared_memory_exists(name); + Pure_Share_Memory::Pure_Share_Memory(std::string_view name, size_t alloc_size) { + auto name_string = std::string(name); + mutex.init("Pure_Share_Memory_" + name_string + "_mutex"); + bool open = check_if_shared_memory_exists(name_string); bool ok; bool create; std::ostringstream oss; if (open) { oss << "【打开共享内存】:[" << name << "]" << std::endl; - ok = shm.open(name, alloc_size); + ok = shm.open(name_string, alloc_size); create = false; } else { oss << "【创建共享内存】】:[" << name << "]" << std::endl; - ok = shm.create(name, alloc_size); + ok = shm.create(name_string, alloc_size); create = true; } diff --git a/Core/Shared_Memory/Shared_Memory.h b/Core/Shared_Memory/Shared_Memory.h index 2c04a47..f409345 100644 --- a/Core/Shared_Memory/Shared_Memory.h +++ b/Core/Shared_Memory/Shared_Memory.h @@ -1,4 +1,5 @@ #pragma once +#include #include "../Base/global_include.h" #include "../system/export.h" #include @@ -9,13 +10,13 @@ #include namespace Psc { - bool check_if_shared_memory_exists(const std::string &name); + bool check_if_shared_memory_exists(std::string_view name); class Shared_Memory { public: Shared_Memory() = default; ~Shared_Memory(); - bool create(const std::string &name, size_t size); - bool open(const std::string &name, size_t size); + bool create(std::string_view name, size_t size); + bool open(std::string_view name, size_t size); [[nodiscard]] uint8_t *data() const { return (uint8_t *) m_ptr; } [[nodiscard]] size_t size() const { return m_size; } void close(); @@ -35,7 +36,7 @@ namespace Psc { class Cross_Process_Mutex { public: explicit Cross_Process_Mutex(); - void init(const std::string &mutexName); + void init(std::string_view mutexName); ~Cross_Process_Mutex(); void lock(); void unlock(); @@ -74,7 +75,7 @@ namespace Psc { public: Shared_Memory shm; Cross_Process_Mutex mutex; - Pure_Share_Memory(const std::string &name, size_t alloc_size); + Pure_Share_Memory(std::string_view name, size_t alloc_size); }; diff --git a/Core/Shared_Memory/Shared_Memory_linux.cpp b/Core/Shared_Memory/Shared_Memory_linux.cpp index 82590ae..b963278 100644 --- a/Core/Shared_Memory/Shared_Memory_linux.cpp +++ b/Core/Shared_Memory/Shared_Memory_linux.cpp @@ -15,9 +15,10 @@ #include #include #include +#include namespace Psc { -bool check_if_shared_memory_exists(const std::string &name) { +bool check_if_shared_memory_exists(std::string_view name) { int fd = shm_open(name.c_str(), O_RDWR, 0777); if (fd < 0) { return false; @@ -26,7 +27,7 @@ bool check_if_shared_memory_exists(const std::string &name) { return true; } Shared_Memory::~Shared_Memory() { close(); } -bool Shared_Memory::create(const std::string &name, size_t size) { +bool Shared_Memory::create(std::string_view name, size_t size) { m_name = name; m_size = size; m_fd = shm_open(name.c_str(), O_CREAT | O_RDWR, 0777); @@ -41,7 +42,7 @@ bool Shared_Memory::create(const std::string &name, size_t size) { } return m_ptr != MAP_FAILED; } -bool Shared_Memory::open(const std::string &name, size_t size) { +bool Shared_Memory::open(std::string_view name, size_t size) { m_name = name; m_size = size; m_fd = shm_open(name.c_str(), O_RDWR, 0777); @@ -72,7 +73,7 @@ struct MutexBlock { Cross_Process_Mutex::Cross_Process_Mutex() {} -void Cross_Process_Mutex::init(const std::string &mutexName) { +void Cross_Process_Mutex::init(std::string_view mutexName) { this->m_mutexName = mutexName; bool creator = false; diff --git a/Core/Shared_Memory/Shared_Memory_win.cpp b/Core/Shared_Memory/Shared_Memory_win.cpp index b932156..174947a 100644 --- a/Core/Shared_Memory/Shared_Memory_win.cpp +++ b/Core/Shared_Memory/Shared_Memory_win.cpp @@ -1,4 +1,5 @@ #include "Shared_Memory.h" +#include #ifdef _WIN32 #include namespace Psc { @@ -16,7 +17,7 @@ static std::string win_error_msg(DWORD err = GetLastError()) { } Cross_Process_Mutex::Cross_Process_Mutex() : m_mutexHandle(nullptr) {} -void Cross_Process_Mutex::init(const std::string &mutexName) { +void Cross_Process_Mutex::init(std::string_view mutexName) { m_mutexName = mutexName; m_mutexHandle = OpenMutexA(MUTEX_ALL_ACCESS, FALSE, m_mutexName.c_str()); if (!m_mutexHandle) { @@ -57,8 +58,9 @@ void Cross_Process_Mutex::unlock() { } } -bool check_if_shared_memory_exists(const std::string &name) { - HANDLE hMapFile = OpenFileMappingA(FILE_MAP_READ, FALSE, name.c_str()); +bool check_if_shared_memory_exists(std::string_view name) { + auto name_string = std::string(name); + HANDLE hMapFile = OpenFileMappingA(FILE_MAP_READ, FALSE, name_string.c_str()); if (!hMapFile) { DWORD err = GetLastError(); if (err != ERROR_FILE_NOT_FOUND) { @@ -74,12 +76,13 @@ bool check_if_shared_memory_exists(const std::string &name) { Shared_Memory::~Shared_Memory() { close(); } -bool Shared_Memory::create(const std::string &name, size_t size) { +bool Shared_Memory::create(std::string_view name, size_t size) { std::cout << "创建共享内存【" << name << "】" << std::endl; + auto name_string = std::string(name); m_size = size; m_handle = CreateFileMappingA(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, - 0, (DWORD)size, name.c_str()); + 0, (DWORD)size, name_string.c_str()); if (!m_handle) { std::cerr << "CreateFileMappingA failed for name=" << name << ": " @@ -98,11 +101,12 @@ bool Shared_Memory::create(const std::string &name, size_t size) { return true; } -bool Shared_Memory::open(const std::string &name, size_t size) { +bool Shared_Memory::open(std::string_view name, size_t size) { std::cout << "打开共享内存【" << name << "】" << std::endl; + auto name_string = std::string(name); m_size = size; - m_handle = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, name.c_str()); + m_handle = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, name_string.c_str()); if (!m_handle) { std::cerr << "OpenFileMappingA failed for name=" << name << ": " diff --git a/Core/Statistics/Frequency_Limit.h b/Core/Statistics/Frequency_Limit.h index 0c81cc0..b34598d 100644 --- a/Core/Statistics/Frequency_Limit.h +++ b/Core/Statistics/Frequency_Limit.h @@ -1,4 +1,5 @@ #pragma once +#include #include "global.h" template class Frequency_Limit_T { @@ -42,21 +43,21 @@ public: }; // 设置某个类型的频率 - void set_rate(const std::string &type, double times_per_second) { + void set_rate(std::string_view type, double times_per_second) { std::lock_guard lock(mtx_); - map_[type].interval = 1.0 / times_per_second; + map_[std::string(type)].interval = 1.0 / times_per_second; // 注意:不重置 last,避免突发放行 } // 测试是否允许执行 - bool test(const std::string &type) { + bool test(std::string_view type) { using namespace std::chrono; const auto now = steady_clock::now(); std::lock_guard lock(mtx_); - auto &info = map_[type]; + auto &info = map_[std::string(type)]; // 第一次使用该 type if (info.interval == 0.0) { diff --git a/Core/socket/Socket.h b/Core/socket/Socket.h index 27b5a4b..6c495a6 100644 --- a/Core/socket/Socket.h +++ b/Core/socket/Socket.h @@ -1,4 +1,5 @@ #pragma once +#include #include "../Base/JSON.h" #include "../system/export.h" @@ -23,7 +24,7 @@ struct Sockaddr_In { std::uint32_t port{}; Sockaddr_In() = default; - Sockaddr_In(const std::string& ip, std::uint32_t port) : ip(ip), port(port) {} + Sockaddr_In(std::string_view ip, std::uint32_t port) : ip(ip), port(port) {} [[nodiscard]] std::string to_string() const { return ip + ":" + std::to_string(port); diff --git a/Core/socket/Socket_Coro.h b/Core/socket/Socket_Coro.h index 31e4a95..6d6d31f 100644 --- a/Core/socket/Socket_Coro.h +++ b/Core/socket/Socket_Coro.h @@ -1,11 +1,10 @@ #pragma once - +#include #include "ASIO_Utils.h" #include "TCP_Client.h" #include "TCP_Server.h" #include "UDP_Client.h" #include "UDP_Server.h" - #include #include #include @@ -16,231 +15,177 @@ #include #include #include - namespace Psc::asio_socket { - class TCP_Client_Coro : public TCP_Client { public: - [[nodiscard]] asio::awaitable connect_coro() { - auto started = start_connect(); - tick(); - co_return started; - } - - [[nodiscard]] asio::awaitable tick_coro() { - tick(); - co_return; - } - - [[nodiscard]] asio::awaitable read_coro() { - co_return read(); - } - - [[nodiscard]] asio::awaitable send_coro(std::string data) { - send(data); - co_return; - } - - [[nodiscard]] asio::awaitable close_coro() { - close(); - co_return; - } + [[nodiscard]] asio::awaitable connect_coro() { + auto started = start_connect(); + tick(); + co_return started; + } + [[nodiscard]] asio::awaitable tick_coro() { + tick(); + co_return; + } + [[nodiscard]] asio::awaitable read_coro() { + co_return read(); + } + [[nodiscard]] asio::awaitable send_coro(std::string_view data) { + send(data); + co_return; + } + [[nodiscard]] asio::awaitable close_coro() { + close(); + co_return; + } }; - class TCP_Server_Coro : public TCP_Server { public: - [[nodiscard]] asio::awaitable listen_coro(std::string ip, - std::uint32_t port) { - co_return listen(std::move(ip), port); - } - - [[nodiscard]] asio::awaitable listen_coro(Sockaddr_In address) { - co_return listen(address); - } - - [[nodiscard]] asio::awaitable tick_coro() { - tick(); - co_return; - } - - [[nodiscard]] asio::awaitable flush_clients_coro() { - flush_clients(); - co_return; - } - - [[nodiscard]] asio::awaitable - write_to_all_clients_coro(std::string data) { - write_to_all_clients(data); - co_return; - } - - [[nodiscard]] asio::awaitable> - read_from_all_clients_coro() { - co_return read_from_all_clients(); - } - - [[nodiscard]] asio::awaitable> - accept_coro() const { - co_return accept(); - } - - [[nodiscard]] asio::awaitable close_coro() { - close(); - co_return; - } + [[nodiscard]] asio::awaitable listen_coro(std::string_view ip, + std::uint32_t port) { + co_return listen(std::move(ip), port); + } + [[nodiscard]] asio::awaitable listen_coro(const Sockaddr_In& address) { + co_return listen(address); + } + [[nodiscard]] asio::awaitable tick_coro() { + tick(); + co_return; + } + [[nodiscard]] asio::awaitable flush_clients_coro() { + flush_clients(); + co_return; + } + [[nodiscard]] asio::awaitable write_to_all_clients_coro(std::string_view data) { + write_to_all_clients(data); + co_return; + } + [[nodiscard]] asio::awaitable> read_from_all_clients_coro() { + co_return read_from_all_clients(); + } + [[nodiscard]] asio::awaitable> accept_coro() const { + co_return accept(); + } + [[nodiscard]] asio::awaitable close_coro() { + close(); + co_return; + } }; - class UDP_Client_Coro : public UDP_Client { public: - [[nodiscard]] asio::awaitable connect_coro() { - co_return connect(); - } - - [[nodiscard]] asio::awaitable read_coro() { - co_return read(); - } - - [[nodiscard]] asio::awaitable tick_coro() { - tick(); - co_return; - } - - [[nodiscard]] asio::awaitable send_coro(std::string data) { - send(data); - co_return; - } - - [[nodiscard]] asio::awaitable close_coro() { - close(); - co_return; - } + [[nodiscard]] asio::awaitable connect_coro() { + co_return connect(); + } + [[nodiscard]] asio::awaitable read_coro() { + co_return read(); + } + [[nodiscard]] asio::awaitable tick_coro() { + tick(); + co_return; + } + [[nodiscard]] asio::awaitable send_coro(std::string_view data) { + send(data); + co_return; + } + [[nodiscard]] asio::awaitable close_coro() { + close(); + co_return; + } }; - class UDP_Server_Coro : public UDP_Server { public: - [[nodiscard]] asio::awaitable bind_coro() { co_return bind(); } - - [[nodiscard]] asio::awaitable tick_coro() { - tick(); - co_return; - } - - [[nodiscard]] asio::awaitable> read_coro() { - co_return read(); - } - - [[nodiscard]] asio::awaitable - reply_last_peer_coro(std::string data) { - reply_last_peer(data); - co_return; - } - - [[nodiscard]] asio::awaitable - send_to_coro(std::string ip, uint16_t port, std::string data) { - send_to(ip, port, data); - co_return; - } - - [[nodiscard]] asio::awaitable - write_to_all_clients_coro(std::string msg) { - write_to_all_clients(msg); - co_return; - } - - [[nodiscard]] asio::awaitable close_coro() { - close(); - co_return; - } + [[nodiscard]] asio::awaitable bind_coro() { + co_return bind(); + } + [[nodiscard]] asio::awaitable tick_coro() { + tick(); + co_return; + } + [[nodiscard]] asio::awaitable> read_coro() { + co_return read(); + } + [[nodiscard]] asio::awaitable reply_last_peer_coro(std::string_view data) { + reply_last_peer(data); + co_return; + } + [[nodiscard]] asio::awaitable send_to_coro(std::string_view ip, uint16_t port, std::string_view data) { + send_to(ip, port, data); + co_return; + } + [[nodiscard]] asio::awaitable write_to_all_clients_coro(std::string_view msg) { + write_to_all_clients(msg); + co_return; + } + [[nodiscard]] asio::awaitable close_coro() { + close(); + co_return; + } }; - } // namespace Psc::asio_socket - namespace Psc::asio_socket::coro { - struct TCP_Read_Result { - std::vector data; + std::vector data; }; - struct UDP_Read_Result { - Sockaddr_In remote; - std::vector data; + Sockaddr_In remote; + std::vector data; }; - -inline void throw_if_error(const asio::error_code &ec) { - if (ec) { - throw std::system_error(ec); - } +inline void throw_if_error(const asio::error_code& ec) { + if (ec) { + throw std::system_error(ec); + } } - inline asio::awaitable< - std::shared_ptr> -tcp_resolve(asio::ip::tcp::resolver &resolver, std::string host, - std::uint16_t port) { - auto endpoints = - co_await resolver.async_resolve(host, std::to_string(port), asio::use_awaitable); - co_return std::make_shared(std::move(endpoints)); + std::shared_ptr> tcp_resolve(asio::ip::tcp::resolver& resolver, std::string_view host, + std::uint16_t port) { + auto endpoints = + co_await resolver.async_resolve(host, std::to_string(port), asio::use_awaitable); + co_return std::make_shared(std::move(endpoints)); } - -inline asio::awaitable -tcp_connect(asio::ip::tcp::socket &socket, - const asio::ip::tcp::resolver::results_type &endpoints) { - co_return co_await asio::async_connect(socket, endpoints, asio::use_awaitable); +inline asio::awaitable tcp_connect(asio::ip::tcp::socket& socket, + const asio::ip::tcp::resolver::results_type& endpoints) { + co_return co_await asio::async_connect(socket, endpoints, asio::use_awaitable); } - -inline asio::awaitable -tcp_connect(asio::ip::tcp::socket &socket, asio::ip::tcp::resolver &resolver, - std::string host, std::uint16_t port) { - auto endpoints = co_await tcp_resolve(resolver, std::move(host), port); - co_return co_await tcp_connect(socket, *endpoints); +inline asio::awaitable tcp_connect(asio::ip::tcp::socket& socket, asio::ip::tcp::resolver& resolver, + std::string_view host, std::uint16_t port) { + auto endpoints = co_await tcp_resolve(resolver, std::move(host), port); + co_return co_await tcp_connect(socket, *endpoints); } - -inline asio::awaitable> -tcp_accept(asio::ip::tcp::acceptor &acceptor) { - auto socket = - std::make_shared(acceptor.get_executor()); - co_await acceptor.async_accept(*socket, asio::use_awaitable); - co_return socket; +inline asio::awaitable> tcp_accept(asio::ip::tcp::acceptor& acceptor) { + auto socket = + std::make_shared(acceptor.get_executor()); + co_await acceptor.async_accept(*socket, asio::use_awaitable); + co_return socket; } - -inline asio::awaitable -tcp_read_some(asio::ip::tcp::socket &socket, std::size_t max_size = 16 * 1024) { - std::vector buffer(max_size); - auto size = co_await socket.async_read_some(asio::buffer(buffer), asio::use_awaitable); - buffer.resize(size); - co_return TCP_Read_Result{std::move(buffer)}; +inline asio::awaitable tcp_read_some(asio::ip::tcp::socket& socket, std::size_t max_size = 16 * 1024) { + std::vector buffer(max_size); + auto size = co_await socket.async_read_some(asio::buffer(buffer), asio::use_awaitable); + buffer.resize(size); + co_return TCP_Read_Result{std::move(buffer)}; } - -inline asio::awaitable -tcp_write(asio::ip::tcp::socket &socket, std::string data) { - co_return co_await asio::async_write(socket, asio::buffer(data), asio::use_awaitable); +inline asio::awaitable tcp_write(asio::ip::tcp::socket& socket, std::string_view data) { + co_return co_await asio::async_write(socket, asio::buffer(data), asio::use_awaitable); } - -inline asio::awaitable -udp_receive_from(asio::ip::udp::socket &socket, - std::size_t max_size = 16 * 1024) { - std::vector buffer(max_size); - asio::ip::udp::endpoint remote; - auto size = co_await socket.async_receive_from(asio::buffer(buffer), remote, asio::use_awaitable); - buffer.resize(size); - co_return UDP_Read_Result{endpoint_to_sockaddr(remote), std::move(buffer)}; +inline asio::awaitable udp_receive_from(asio::ip::udp::socket& socket, + std::size_t max_size = 16 * 1024) { + std::vector buffer(max_size); + asio::ip::udp::endpoint remote; + auto size = co_await socket.async_receive_from(asio::buffer(buffer), remote, asio::use_awaitable); + buffer.resize(size); + co_return UDP_Read_Result{endpoint_to_sockaddr(remote), std::move(buffer)}; } - -inline asio::awaitable -udp_send_to(asio::ip::udp::socket &socket, std::string data, - asio::ip::udp::endpoint remote) { - co_return co_await socket.async_send_to(asio::buffer(data), remote, asio::use_awaitable); +inline asio::awaitable udp_send_to(asio::ip::udp::socket& socket, std::string_view data, + asio::ip::udp::endpoint remote) { + co_return co_await socket.async_send_to(asio::buffer(data), remote, asio::use_awaitable); } - -inline asio::awaitable -udp_send_to(asio::ip::udp::socket &socket, std::string data, - const Sockaddr_In &remote) { - asio::error_code ec; - auto address = asio::ip::make_address(remote.ip, ec); - throw_if_error(ec); - co_return co_await udp_send_to( - socket, std::move(data), - asio::ip::udp::endpoint(address, - static_cast(remote.port))); +inline asio::awaitable udp_send_to(asio::ip::udp::socket& socket, std::string_view data, + const Sockaddr_In& remote) { + asio::error_code ec; + auto address = asio::ip::make_address(remote.ip, ec); + throw_if_error(ec); + co_return co_await udp_send_to( + socket, std::move(data), + asio::ip::udp::endpoint(address, + static_cast(remote.port))); } - } // namespace Psc::asio_socket::coro diff --git a/Core/socket/TCP_Client.cpp b/Core/socket/TCP_Client.cpp index 8bfb565..6001a4a 100644 --- a/Core/socket/TCP_Client.cpp +++ b/Core/socket/TCP_Client.cpp @@ -1,6 +1,7 @@ #include "TCP_Client.h" #include +#include namespace Psc::asio_socket { @@ -190,7 +191,7 @@ std::string TCP_Client::read() { return ret; } -void TCP_Client::send(const std::string &data) { +void TCP_Client::send(std::string_view data) { if (data.empty()) return; send_buffer.write_best_effort(data.data(), data.size()); diff --git a/Core/socket/TCP_Client.h b/Core/socket/TCP_Client.h index 28fcb5c..983fc7f 100644 --- a/Core/socket/TCP_Client.h +++ b/Core/socket/TCP_Client.h @@ -1,4 +1,5 @@ #pragma once +#include #include "ASIO_Utils.h" @@ -20,7 +21,7 @@ public: void create(); void tick(); std::string read(); - void send(const std::string &data); + void send(std::string_view data); std::string to_string() override; enum State { diff --git a/Core/socket/TCP_Server.cpp b/Core/socket/TCP_Server.cpp index 5b8f872..a759988 100644 --- a/Core/socket/TCP_Server.cpp +++ b/Core/socket/TCP_Server.cpp @@ -1,6 +1,7 @@ #include "TCP_Server.h" #include +#include namespace Psc::asio_socket { @@ -48,7 +49,7 @@ TCP_Server &TCP_Server::create() { return *this; } -bool TCP_Server::listen(const std::string &ip, std::uint32_t port) { +bool TCP_Server::listen(std::string_view ip, std::uint32_t port) { return listen(Sockaddr_In(ip, port)); } @@ -265,7 +266,7 @@ void TCP_Server::flush_clients() { } } -void TCP_Server::write_to_all_clients(const std::string &data) { +void TCP_Server::write_to_all_clients(std::string_view data) { if (data.empty()) return; for (auto &[_, conn] : tcp_clients) { diff --git a/Core/socket/TCP_Server.h b/Core/socket/TCP_Server.h index ead72a6..10267d8 100644 --- a/Core/socket/TCP_Server.h +++ b/Core/socket/TCP_Server.h @@ -1,4 +1,5 @@ #pragma once +#include #include "ASIO_Utils.h" #include "Core/Statistics/Statistics.h" @@ -38,10 +39,10 @@ public: TCP_Server &set_connect_system_buffer_size(size_t size); TCP_Server &set_connect_user_buffer_size(size_t size); TCP_Server &set_recv_system_buffer_size(size_t size); - bool listen(const std::string &ip, std::uint32_t port); + bool listen(std::string_view ip, std::uint32_t port); bool listen(const Sockaddr_In &address); std::string to_string() override; - void write_to_all_clients(const std::string &data); + void write_to_all_clients(std::string_view data); struct Read_Info { Accept_Info info; diff --git a/Core/socket/UDP_Client.cpp b/Core/socket/UDP_Client.cpp index 049756f..cfea6fa 100644 --- a/Core/socket/UDP_Client.cpp +++ b/Core/socket/UDP_Client.cpp @@ -1,4 +1,5 @@ #include "UDP_Client.h" +#include namespace Psc::asio_socket { @@ -85,7 +86,7 @@ void UDP_Client::tick() { } } -void UDP_Client::send(const std::string &data) { +void UDP_Client::send(std::string_view data) { if (data.empty()) return; send_buffer.write(data.data(), data.size()); diff --git a/Core/socket/UDP_Client.h b/Core/socket/UDP_Client.h index 9e01ec7..d284790 100644 --- a/Core/socket/UDP_Client.h +++ b/Core/socket/UDP_Client.h @@ -1,55 +1,48 @@ #pragma once - +#include #include "ASIO_Utils.h" - #include #include #include - namespace Psc::asio_socket { - class UDP_Client { public: - void set_dest_address(const Sockaddr_In &value) { dest_address = value; } - void set_dest_address(std::string ip, std::uint32_t port) { - dest_address = Sockaddr_In(ip, port); - } - void create(); - bool connect(); - std::string read(); - void tick(); - void send(const std::string &data); - void close(); - std::string to_string(); - - Sockaddr_In dest_address; - - enum State { - Not_Created, - Not_Set_Field, - Connecting, - Working, - }; - - State state = Not_Created; - + void set_dest_address(const Sockaddr_In& value) { + dest_address = value; + } + void set_dest_address(std::string_view ip, std::uint32_t port) { + dest_address = Sockaddr_In(ip, port); + } + void create(); + bool connect(); + std::string read(); + void tick(); + void send(std::string_view data); + void close(); + std::string to_string(); + Sockaddr_In dest_address; + enum State { + Not_Created, + Not_Set_Field, + Connecting, + Working, + }; + State state = Not_Created; private: - asio::io_context io_context; - std::unique_ptr socket; - asio::ip::udp::endpoint endpoint; - bool connected = false; - int read_chunk_size = 1024 * 1024; - size_t user_buffer_size = 1024 * 1024; - ASIO_PacketRingBuffer send_buffer; - ASIO_PacketRingBuffer recv_buffer; - std::vector recv_storage; - std::vector send_storage; - bool connect_pending = false; - bool read_pending = false; - bool write_pending = false; - - void start_read(); - void start_write(); + asio::io_context io_context; + std::unique_ptr socket; + asio::ip::udp::endpoint endpoint; + bool connected = false; + int read_chunk_size = 1024 * 1024; + size_t user_buffer_size = 1024 * 1024; + ASIO_PacketRingBuffer send_buffer; + ASIO_PacketRingBuffer recv_buffer; + std::vector recv_storage; + std::vector send_storage; + bool connect_pending = false; + bool read_pending = false; + bool write_pending = false; + void start_read(); + void start_write(); }; - } // namespace Psc::asio_socket diff --git a/Core/socket/UDP_Server.cpp b/Core/socket/UDP_Server.cpp index 96556b1..814942a 100644 --- a/Core/socket/UDP_Server.cpp +++ b/Core/socket/UDP_Server.cpp @@ -1,6 +1,7 @@ #include "UDP_Server.h" #include +#include namespace Psc::asio_socket { @@ -160,14 +161,14 @@ std::vector UDP_Server::read() { return ret; } -void UDP_Server::reply_last_peer(const std::string &data) { +void UDP_Server::reply_last_peer(std::string_view data) { if (!has_last_peer) return; send_to(last_peer.ip, static_cast(last_peer.port), data); } -void UDP_Server::send_to(const std::string &ip, uint16_t port, - const std::string &data) { +void UDP_Server::send_to(std::string_view ip, uint16_t port, + std::string_view data) { if (data.empty()) return; if (!bound && !bind()) @@ -183,7 +184,7 @@ void UDP_Server::send_to(const std::string &ip, uint16_t port, start_write(); } -void UDP_Server::write_to_all_clients(const std::string &msg) { +void UDP_Server::write_to_all_clients(std::string_view msg) { for (const auto &client : clients) { send_to(client.ip, static_cast(client.port), msg); } diff --git a/Core/socket/UDP_Server.h b/Core/socket/UDP_Server.h index a4877a8..a2f02f8 100644 --- a/Core/socket/UDP_Server.h +++ b/Core/socket/UDP_Server.h @@ -1,4 +1,5 @@ #pragma once +#include #include "ASIO_Utils.h" @@ -11,7 +12,7 @@ namespace Psc::asio_socket { class UDP_Server { public: void set_bind_address(const Sockaddr_In &addr) { bind_address = addr; } - void set_bind_address(const std::string &ip, std::uint32_t port) { + void set_bind_address(std::string_view ip, std::uint32_t port) { bind_address = Sockaddr_In(ip, port); } [[nodiscard]] std::string to_string() const { @@ -22,9 +23,9 @@ public: bool bind(); void tick(); void close(); - void reply_last_peer(const std::string &data); - void send_to(const std::string &ip, uint16_t port, const std::string &data); - void write_to_all_clients(const std::string &msg); + void reply_last_peer(std::string_view data); + void send_to(std::string_view ip, uint16_t port, std::string_view data); + void write_to_all_clients(std::string_view msg); struct Read_Info { Sockaddr_In peer; diff --git a/Core/spdlog/export.cpp b/Core/spdlog/export.cpp index cdc0ae6..e8f315b 100644 --- a/Core/spdlog/export.cpp +++ b/Core/spdlog/export.cpp @@ -8,12 +8,13 @@ #include "Core/Base/global_include.h" #include "spdlog/sinks/basic_file_sink.h" #include "spdlog/spdlog.h" +#include #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include "Windows.h" #else -std::string handle_fileName(const std::string &utf8_str) { return utf8_str; } +std::string handle_fileName(std::string_view utf8_str) { return std::string(utf8_str); } #endif #include "../system/export.h" #include "spdlog/async.h" @@ -54,8 +55,9 @@ std::string get_current_date_string() { } std::shared_ptr -create_rotating_logger(const std::string &key, size_t byte_size, size_t num) { - std::string fileName = "@/logs/" + key + ".log"; +create_rotating_logger(std::string_view key, size_t byte_size, size_t num) { + auto key_string = std::string(key); + std::string fileName = "@/logs/" + key_string + ".log"; fileName = Psc::get_abs_path(fileName); fileName = Psc::utf8_2_platform(fileName); Psc::create_file_if_not_exists(fileName); @@ -64,7 +66,7 @@ create_rotating_logger(const std::string &key, size_t byte_size, size_t num) { std::vector sinks = {rotating_sink}; auto logger = std::make_shared( - key, // Logger 名称 + key_string, // Logger 名称 sinks.begin(), sinks.end(), // Sinks 列表 spdlog::thread_pool(), // 使用初始化的线程池 spdlog::async_overflow_policy::block // 当队列满时,阻塞写入 @@ -72,13 +74,14 @@ create_rotating_logger(const std::string &key, size_t byte_size, size_t num) { return logger; } std::map> day_log_map; -void rotating_log(const std::string &key, const std::string &info, int size, +void rotating_log(std::string_view key, std::string_view info, int size, int num) { try { - if (day_log_map.find(key) == day_log_map.end()) { - day_log_map.insert({key, create_rotating_logger(key, size, num)}); + auto key_string = std::string(key); + if (day_log_map.find(key_string) == day_log_map.end()) { + day_log_map.insert({key_string, create_rotating_logger(key_string, size, num)}); } - std::shared_ptr daily_logger = day_log_map[key]; + std::shared_ptr daily_logger = day_log_map[key_string]; daily_logger->set_pattern("%Y-%m-%d %H:%M:%S [%l] %v"); daily_logger->info(info); daily_logger->flush(); @@ -87,15 +90,16 @@ void rotating_log(const std::string &key, const std::string &info, int size, } } -void pure_log(const std::string &pure_path, const std::string &info, +void pure_log(std::string_view pure_path, std::string_view info, bool close_after_write) { auto path = Psc::get_abs_path(pure_path); static std::map> file_logger_map; static std::mutex mtx; // 用于保护file_logger_map static std::mutex mtx2; // 用于保护file_logger_map - static auto create_pure_logger = [](const std::string &fileName) { - Psc::create_file_if_not_exists(fileName); - auto c = spdlog::basic_logger_mt(fileName, fileName); + static auto create_pure_logger = [](std::string_view fileName) { + auto file_name_string = std::string(fileName); + Psc::create_file_if_not_exists(file_name_string); + auto c = spdlog::basic_logger_mt(file_name_string, file_name_string); auto formatter = std::make_unique( "%v", spdlog::pattern_time_type::local, "", spdlog::pattern_formatter::custom_flags()); @@ -125,13 +129,13 @@ void pure_log(const std::string &pure_path, const std::string &info, } } -Log_Type &Log_Type::append(std::string key) { - list.push_back(key); +Log_Type &Log_Type::append(std::string_view key) { + list.push_back(std::string(key)); return *this; } -Log_Type &Log_Type::append(std::string key, std::string val) { - map.push_back({key, val}); +Log_Type &Log_Type::append(std::string_view key, std::string_view val) { + map.push_back({std::string(key), std::string(val)}); return *this; } @@ -149,7 +153,7 @@ std::string Log_Type::to_string() const { return base; } -Log_Type &Log_Type::set(const std::string &key, std::string val) { +Log_Type &Log_Type::set(std::string_view key, std::string_view val) { append(key, val); return *this; } @@ -171,7 +175,7 @@ struct my_daily_filename_calculator { }; } // namespace spdlog -BaseLogger::BaseLogger(const std::string &log_path, size_t byte_size, +BaseLogger::BaseLogger(std::string_view log_path, size_t byte_size, size_t piece_num) : log_path(log_path), byte_size(byte_size), piece_num(piece_num) { std::string path = Psc::get_abs_path(log_path); @@ -249,18 +253,18 @@ void BaseLogger::log_main(const Log_Info &log_info) const { } } -void BaseLogger::c_debug(const std::string &func_pattern, - const Log_Type &log_type, const std::string &content) { - log_main({true, spdlog::level::debug, func_pattern, log_type, content}); +void BaseLogger::c_debug(std::string_view func_pattern, + const Log_Type &log_type, std::string_view content) { + log_main({true, spdlog::level::debug, std::string(func_pattern), log_type, std::string(content)}); } -void BaseLogger::debug(const std::string &func_pattern, - const Log_Type &log_type, const std::string &content) { - log_main({false, spdlog::level::debug, func_pattern, log_type, content}); +void BaseLogger::debug(std::string_view func_pattern, + const Log_Type &log_type, std::string_view content) { + log_main({false, spdlog::level::debug, std::string(func_pattern), log_type, std::string(content)}); } -void BaseLogger::error(const std::string &func_pattern, - const Log_Type &log_type, const std::string &content) { - log_main({true, spdlog::level::err, func_pattern, log_type, content}); +void BaseLogger::error(std::string_view func_pattern, + const Log_Type &log_type, std::string_view content) { + log_main({true, spdlog::level::err, std::string(func_pattern), log_type, std::string(content)}); logger->flush(); } diff --git a/Core/spdlog/export.h b/Core/spdlog/export.h index b482247..ffcbfb3 100644 --- a/Core/spdlog/export.h +++ b/Core/spdlog/export.h @@ -1,4 +1,5 @@ #pragma once +#include #include "../Base/global_include.h" @@ -11,10 +12,10 @@ #include #include -void rotating_log(const std::string& fileName, const std::string& info, int size = 10 * 1024 * 1024, int num = 10); +void rotating_log(std::string_view fileName, std::string_view info, int size = 10 * 1024 * 1024, int num = 10); // 自带换行符 -void pure_log(const std::string& path, const std::string& info, bool close_after_write = false); +void pure_log(std::string_view path, std::string_view info, bool close_after_write = false); @@ -23,10 +24,10 @@ struct Log_Type { explicit Log_Type(std::vector list); explicit Log_Type(std::vector> map); Log_Type(std::vector list, std::vector> map); - Log_Type& append(std::string key); - Log_Type& append(std::string key, std::string val); + Log_Type& append(std::string_view key); + Log_Type& append(std::string_view key, std::string_view val); [[nodiscard]] std::string to_string() const; - Log_Type& set(const std::string& key, std::string val); + Log_Type& set(std::string_view key, std::string_view val); bool new_line = false; protected: std::vector list; @@ -35,10 +36,10 @@ protected: class BaseLogger { public: - BaseLogger(const std::string& path, size_t byte_size, size_t piece_num); - void c_debug(const std::string& func_pattern, const Log_Type& log_type, const std::string& content); - void debug(const std::string& func_pattern, const Log_Type& log_type, const std::string& content); - void error(const std::string& func_pattern, const Log_Type& log_type, const std::string& content); + BaseLogger(std::string_view path, size_t byte_size, size_t piece_num); + void c_debug(std::string_view func_pattern, const Log_Type& log_type, std::string_view content); + void debug(std::string_view func_pattern, const Log_Type& log_type, std::string_view content); + void error(std::string_view func_pattern, const Log_Type& log_type, std::string_view content); struct Log_Info{ bool console; spdlog::level::level_enum level; diff --git a/Core/system/export.cpp b/Core/system/export.cpp index 6262fc0..830a7bd 100644 --- a/Core/system/export.cpp +++ b/Core/system/export.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #if defined(_WIN32) #include "windows_include.h" @@ -124,20 +125,20 @@ std::string get_exe_dir() { return std::filesystem::path(exe_path).parent_path().string(); } -std::string get_abs_path(const std::string &path) { +std::string get_abs_path(std::string_view path) { if (path.empty()) { - return path; + return ""; } if (path.rfind("@", 0) == 0) { - return get_exe_dir() + path.substr(1); + return get_exe_dir() + std::string(path.substr(1)); } if (path.rfind("~", 0) == 0) { - return get_home_dir() + path.substr(1); + return get_home_dir() + std::string(path.substr(1)); } - return path; + return std::string(path); } std::string utc_2_local_time(std::time_t us_timestamp, const char *format) { @@ -239,7 +240,7 @@ std::uint32_t base64_decode_raw(const std::uint8_t *code, } } // namespace -std::string base64_encode(const std::string &data) { +std::string base64_encode(std::string_view data) { const auto text_len = static_cast(data.size()); std::vector encode(4 * ((text_len + 2) / 3)); const std::uint32_t encoded_len = @@ -248,7 +249,7 @@ std::string base64_encode(const std::string &data) { return std::string(encode.begin(), encode.begin() + encoded_len); } -std::string base64_decode(const std::string &data) { +std::string base64_decode(std::string_view data) { const auto code_len = static_cast(data.size()); if ((code_len & 0x03U) != 0U) { return ""; @@ -304,7 +305,7 @@ std::string get_current_time_as_string() { namespace fs = std::filesystem; -void create_file_if_not_exists(const std::string &file_name) { +void create_file_if_not_exists(std::string_view file_name) { std::error_code ec; const fs::path file_path(file_name); @@ -333,7 +334,7 @@ void create_file_if_not_exists(const std::string &file_name) { fs::permissions(file_path, perms, ec); } -void create_dir_if_not_exists(const std::string &dir_name) { +void create_dir_if_not_exists(std::string_view dir_name) { std::error_code ec; const fs::path dir_path(dir_name); @@ -351,8 +352,8 @@ void create_dir_if_not_exists(const std::string &dir_name) { fs::permissions(dir_path, perms, ec); } -void write_stack_trace_to_file(const std::string &stack_trace, - const std::string &filename) { +void write_stack_trace_to_file(std::string_view stack_trace, + std::string_view filename) { create_file_if_not_exists(filename); std::ofstream out_file(filename, std::ios::out | std::ios::app); if (out_file.is_open()) { diff --git a/Core/system/export.h b/Core/system/export.h index 080493a..e3ce5e0 100644 --- a/Core/system/export.h +++ b/Core/system/export.h @@ -1,4 +1,5 @@ #pragma once +#include #include "../Base/global_include.h" @@ -23,10 +24,10 @@ #include "3rd/magic_enum/export.h" #include "magic_enum/magic_enum.hpp" -#define PSC_LOAD_LIBRARY_PARAMS(M, SEP) M(const std::string &, library_path) +#define PSC_LOAD_LIBRARY_PARAMS(M, SEP) M(std::string_view, library_path) #define PSC_LOAD_FUNCTION_PARAMS(M, SEP) \ - M(void *, library) SEP() M(const std::string &, function_name) + M(void *, library) SEP() M(std::string_view, function_name) #define DELETE_COPY(Class) \ Class(const Class &) = delete; \ @@ -39,28 +40,28 @@ std::string get_stack_trace(); std::string get_computer_serial_number(); PSC_DECLARE_TRIPLE_API(void *, load_library, PSC_LOAD_LIBRARY_PARAMS); -void *load_library_fail_fast(const std::string &library_path); +void *load_library_fail_fast(std::string_view library_path); void free_library(void *library); PSC_DECLARE_TRIPLE_API(void *, load_function, PSC_LOAD_FUNCTION_PARAMS); -void *load_function_fail_fast(void *library, const std::string &function_name); +void *load_function_fail_fast(void *library, std::string_view function_name); std::string get_home_dir(); std::string get_exe_path(); std::string get_exe_dir(); -std::string get_abs_path(const std::string &path); -std::string to_upper_case(const std::string &input); -std::string base64_encode(const std::string &data); -std::string base64_decode(const std::string &data); +std::string get_abs_path(std::string_view path); +std::string to_upper_case(std::string_view input); +std::string base64_encode(std::string_view data); +std::string base64_decode(std::string_view data); // strftime 格式,例如 "%Y-%m-%d %H:%M:%S" / "%H:%M:%S"。 std::string utc_2_local_time(std::time_t us_timestamp, const char *format = "%H:%M:%S"); std::uint64_t get_current_millisecond_timestamp(); -void set_current_thread_name(const std::string &name); +void set_current_thread_name(std::string_view name); using Main_Function_Type = int (*)(int, char **); @@ -87,8 +88,8 @@ std::string get_memory_info(); std::string signal_to_string(int signal); std::string get_current_time_as_string(); -void create_file_if_not_exists(const std::string &file_name); -void create_dir_if_not_exists(const std::string &dir_name); +void create_file_if_not_exists(std::string_view file_name); +void create_dir_if_not_exists(std::string_view dir_name); void init_signal_config(std::set normal_quit = {SIGINT, SIGTERM}, std::set ignore_signal = {}); diff --git a/Core/system/linux.cpp b/Core/system/linux.cpp index 01d6656..c681292 100644 --- a/Core/system/linux.cpp +++ b/Core/system/linux.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #if __has_include("Core/JSON.h") #include "Core/JSON.h" @@ -41,7 +42,7 @@ namespace Psc { namespace { -std::string trim_copy(std::string value) { +std::string trim_copy(std::string_view value) { auto not_space = [](unsigned char ch) { return !std::isspace(ch); }; value.erase(value.begin(), std::find_if(value.begin(), value.end(), not_space)); @@ -50,7 +51,7 @@ std::string trim_copy(std::string value) { return value; } -std::string read_first_line(const std::string &file_name) { +std::string read_first_line(std::string_view file_name) { std::ifstream in(file_name); std::string line; if (std::getline(in, line)) { @@ -113,7 +114,7 @@ size_t read_proc_status_kb(const char *key) { } } // namespace -std::string extract_address(const std::string &input) { +std::string extract_address(std::string_view input) { const std::regex address_regex(R"(\[([0-9a-fA-Fx]+)\])"); std::smatch match; if (std::regex_search(input, match, address_regex)) { @@ -122,7 +123,7 @@ std::string extract_address(const std::string &input) { return ""; } -std::string execute_command(const std::string &cmd) { +std::string execute_command(std::string_view cmd) { FILE *fp = popen(cmd.c_str(), "r"); if (!fp) { return ""; @@ -137,7 +138,7 @@ std::string execute_command(const std::string &cmd) { return result; } -std::string get_tool(const std::string &name) { +std::string get_tool(std::string_view name) { std::string ret = name; const std::string exe_dir = get_exe_dir(); const std::string ret_1 = exe_dir + "/" + name; @@ -213,7 +214,7 @@ std::string get_computer_serial_number() { return "Unknown"; } -void set_current_thread_name(const std::string &name) { +void set_current_thread_name(std::string_view name) { std::string trimmed = name.substr(0, 15); // Linux 线程名最多 16 字节,含结尾 \0。 (void)pthread_setname_np(pthread_self(), trimmed.c_str()); @@ -231,7 +232,7 @@ void set_console_utf8() { PSC_DEFINE_TRIPLE_API_FROM_BOOL(void *, load_library, PSC_LOAD_LIBRARY_PARAMS) -bool load_library_ec(const std::string &library_path, void *&out, +bool load_library_ec(std::string_view library_path, void *&out, std::error_code &ec) noexcept { out = nullptr; ec.clear(); @@ -250,7 +251,7 @@ bool load_library_ec(const std::string &library_path, void *&out, return true; } -void *load_library_fail_fast(const std::string &library_path) { +void *load_library_fail_fast(std::string_view library_path) { auto ret = try_load_library(library_path); if (!ret) { Psc::fail_fast(); @@ -266,7 +267,7 @@ void free_library(void *library) { PSC_DEFINE_TRIPLE_API_FROM_BOOL(void *, load_function, PSC_LOAD_FUNCTION_PARAMS) -bool load_function_ec(void *library, const std::string &function_name, +bool load_function_ec(void *library, std::string_view function_name, void *&out, std::error_code &ec) noexcept { out = nullptr; ec.clear(); @@ -290,7 +291,7 @@ bool load_function_ec(void *library, const std::string &function_name, return true; } -void *load_function_fail_fast(void *library, const std::string &function_name) { +void *load_function_fail_fast(void *library, std::string_view function_name) { auto ret = try_load_function(library, function_name); if (!ret) { Psc::fail_fast(); diff --git a/Core/system/win.cpp b/Core/system/win.cpp index 45943cf..3dcfda8 100644 --- a/Core/system/win.cpp +++ b/Core/system/win.cpp @@ -27,10 +27,11 @@ #include "../Base/global_include.h" #include "../system/export.h" #include "Core/Base/JSON.h" +#include namespace Psc { namespace { -std::wstring utf8_to_wide_impl(const std::string &input) { +std::wstring utf8_to_wide_impl(std::string_view input) { if (input.empty()) { return L""; } @@ -71,7 +72,7 @@ std::string wide_to_utf8_impl(const std::wstring &input) { return wide_to_utf8_impl(input.c_str(), static_cast(input.size())); } -std::string codepage_to_utf8(const std::string &input, UINT codepage) { +std::string codepage_to_utf8(std::string_view input, UINT codepage) { if (input.empty()) { return ""; } @@ -88,7 +89,7 @@ std::string codepage_to_utf8(const std::string &input, UINT codepage) { return wide_to_utf8_impl(wide); } -std::string utf8_to_codepage(const std::string &input, UINT codepage) { +std::string utf8_to_codepage(std::string_view input, UINT codepage) { if (input.empty()) { return ""; } @@ -254,7 +255,7 @@ std::string get_stack_trace() { return oss.str(); } -void set_current_thread_name(const std::string &name) { +void set_current_thread_name(std::string_view name) { const std::wstring wname = utf8_to_wide_impl(name); if (wname.empty()) { return; @@ -279,7 +280,7 @@ void set_console_utf8() { PSC_DEFINE_TRIPLE_API_FROM_BOOL(void *, load_library, PSC_LOAD_LIBRARY_PARAMS) -bool load_library_ec(const std::string &library_path, void *&out, +bool load_library_ec(std::string_view library_path, void *&out, std::error_code &ec) noexcept { out = nullptr; ec.clear(); @@ -303,7 +304,7 @@ bool load_library_ec(const std::string &library_path, void *&out, return true; } -void *load_library_fail_fast(const std::string &library_path) { +void *load_library_fail_fast(std::string_view library_path) { auto ret = try_load_library(library_path); if (!ret) { Psc::fail_fast(); @@ -319,7 +320,7 @@ void free_library(void *library) { PSC_DEFINE_TRIPLE_API_FROM_BOOL(void *, load_function, PSC_LOAD_FUNCTION_PARAMS) -bool load_function_ec(void *library, const std::string &function_name, +bool load_function_ec(void *library, std::string_view function_name, void *&out, std::error_code &ec) noexcept { out = nullptr; ec.clear(); @@ -331,8 +332,9 @@ bool load_function_ec(void *library, const std::string &function_name, return false; } + auto function_name_string = std::string(function_name); FARPROC p = - GetProcAddress(reinterpret_cast(library), function_name.c_str()); + GetProcAddress(reinterpret_cast(library), function_name_string.c_str()); if (!p) { ec = std::error_code(static_cast(GetLastError()), std::system_category()); @@ -345,7 +347,7 @@ bool load_function_ec(void *library, const std::string &function_name, return true; } -void *load_function_fail_fast(void *library, const std::string &function_name) { +void *load_function_fail_fast(void *library, std::string_view function_name) { auto ret = try_load_function(library, function_name); if (!ret) { Psc::fail_fast(); @@ -458,8 +460,8 @@ void set_error_code(ERROR_CODE_TYPE code) { SetLastError(static_cast(code)); } -std::string to_upper_case(const std::string &input) { - std::string result = input; +std::string to_upper_case(std::string_view input) { + std::string result(input); for (char &ch : result) { ch = static_cast(std::toupper(static_cast(ch))); } @@ -504,11 +506,11 @@ std::string get_exe_path() { return result; } -std::string utf8_to_gbk(const std::string &utf8Str) { +std::string utf8_to_gbk(std::string_view utf8Str) { return utf8_to_codepage(utf8Str, CP_ACP); } -std::string gbk_to_utf8(const std::string &gbkStr) { +std::string gbk_to_utf8(std::string_view gbkStr) { return codepage_to_utf8(gbkStr, CP_ACP); } diff --git a/psc_global_include/Bit.h b/psc_global_include/Bit.h index 1ce5640..100eab0 100644 --- a/psc_global_include/Bit.h +++ b/psc_global_include/Bit.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -49,6 +50,12 @@ namespace Psc { } }; template <> + struct cacl_type { + using type = std::string; + static size_t size(std::string_view a) {return a.size();} + static void* data(std::string_view a) {return (void*)a.data();} + }; + template <> struct cacl_type { using type = std::string; static size_t size(const char* a) {return std::strlen(a);} @@ -159,9 +166,9 @@ namespace Psc { inline size_t get_bin2mem_size(size_t num) {return num/8;}; void bin2mem(void* dest, const char* data, size_t size); Base - STR_Type bin2mem(const STR_Type& mem, std::pmr::memory_resource* resource = nullptr) { + ret_type bin2mem(const STR_Type& mem, std::pmr::memory_resource* resource = nullptr) { auto size = cacl_type::size(mem); - auto ret = create_string(get_bin2mem_size(size), resource); + auto ret = create_string(get_bin2mem_size(size), resource); bin2mem((void*)ret.data(), (const char*)cacl_type::data(mem), size); return ret; } @@ -226,20 +233,23 @@ namespace Psc { return std::bitset(static_cast(n)).to_string(); } template - T bin2(const std::string& binstr) { - return std::stoull(binstr, nullptr, 2); + T bin2(std::string_view binstr) { + auto text = std::string(binstr); + return std::stoull(text, nullptr, 2); } template - unsigned long long hex2(const std::string& hexstr) { - return std::stoull(hexstr, nullptr, 16); + unsigned long long hex2(std::string_view hexstr) { + auto text = std::string(hexstr); + return std::stoull(text, nullptr, 16); } template <> - inline int bin2(const std::string& binstr) { + inline int bin2(std::string_view binstr) { int bit_limit = sizeof(int) * 8; if (binstr.size() > bit_limit) { std::cout << "Bitset.h inline int bin2 error! Binary string exceeds int bit limit" << std::endl; } - return std::stoi(binstr, nullptr, 2); + auto text = std::string(binstr); + return std::stoi(text, nullptr, 2); }