Browse Source

增加是否使用预编译字节码宏,优化部分代码

xx 2 năm trước cách đây
mục cha
commit
30a7785657

+ 4 - 1
src/core/bytecodemanager.cpp

@@ -1,4 +1,6 @@
-#include "bytecodemanager.h"
+
+#include "bytecodemanager.h"
+#if ENABLE_BYTECODE == 1
 #include "fastweb.h"
 #include "fastweb.h"
 #include "utils/luautils.h"
 #include "utils/luautils.h"
 #include "util/file.h"
 #include "util/file.h"
@@ -75,3 +77,4 @@ bool bytecode_manager::run()
 
 
 	return true;
 	return true;
 }
 }
+#endif

+ 4 - 2
src/core/bytecodemanager.h

@@ -1,6 +1,7 @@
 #pragma once
 #pragma once
 
 
-
+#include "core/define.h"
+#if ENABLE_BYTECODE == 1
 #include "sol/sol.hpp"
 #include "sol/sol.hpp"
 
 
 #include "base/error.h"
 #include "base/error.h"
@@ -40,4 +41,5 @@ private:
 
 
 	// 通过 ithread 继承
 	// 通过 ithread 继承
 	bool run() override;
 	bool run() override;
-};
+};
+#endif

+ 4 - 1
src/core/define.h

@@ -27,4 +27,7 @@
 
 
 
 
 
 
-#define VarType sol::object
+#define VarType sol::object
+
+
+#define ENABLE_BYTECODE 0

+ 89 - 3
src/core/fastweb.cpp

@@ -59,6 +59,7 @@ bool fastweb::start()
 	// 初始化脚本
 	// 初始化脚本
 	if (initialization_script() == false)
 	if (initialization_script() == false)
 		return false;
 		return false;
+#if ENABLE_BYTECODE == 1
 	// 加载服务脚本
 	// 加载服务脚本
 	{
 	{
 		auto luas = ylib::file::traverse(sConfig->scripts.app_dir, "(.*\\.lua)");
 		auto luas = ylib::file::traverse(sConfig->scripts.app_dir, "(.*\\.lua)");
@@ -73,6 +74,7 @@ bool fastweb::start()
 			}
 			}
 		}
 		}
 	}
 	}
+
 	// 加载拦截器脚本
 	// 加载拦截器脚本
 	for_iter(iter, sConfig->website.interceptor_scripts) {
 	for_iter(iter, sConfig->website.interceptor_scripts) {
 		if (interceptor_bytecode.create(iter->regex_express, iter->filepath, true) == false)
 		if (interceptor_bytecode.create(iter->regex_express, iter->filepath, true) == false)
@@ -81,6 +83,7 @@ bool fastweb::start()
 			return false;
 			return false;
 		}
 		}
 	}
 	}
+
 	// 加入LUA服务映射
 	// 加入LUA服务映射
 	{
 	{
 		auto map = service_bytecode.map();
 		auto map = service_bytecode.map();
@@ -146,10 +149,85 @@ bool fastweb::start()
 		}
 		}
 			
 			
 	}
 	}
-	
+#else
+	// 加入LUA服务映射
+	{
+		auto luas = ylib::file::traverse(sConfig->scripts.app_dir, "(.*\\.lua)");
+		for_iter(iter, luas)
+		{
+			if (iter->second == IS_DIRECTORY)
+				continue;
+			std::string path = strutils::replace(iter->first, '\\', '/');
+			auto state = sStateMgr->get_state();
+			std::string route_pattern;
+			network::http::method method = network::http::ALL;
+			try
+			{
+				auto result = state->script_file(sConfig->scripts.app_dir+"/"+ path);
+				if (result.valid()) {
+					auto router = (*state)["route"];
+					auto type = router.get_type();
+					if (router.is<sol::table>())
+					{
+						sol::optional<std::string> route_pattern_param = router[1];
+						sol::optional<int> method_param = router[2];
+						if (route_pattern_param && route_pattern_param->empty() == false)
+							route_pattern = *route_pattern_param;
+						if (method_param)
+							method = (network::http::method)*method_param;
+					}
+				}
+			}
+			catch (const std::exception& e)
+			{
+				LOG_ERROR(e.what());
+			}
+			if (route_pattern.empty())
+				route_pattern = sConfig->scripts.app_mapping_dir + path;
+
+			// OutPutLog
+			{
+				std::string log;
+				log = "[subscribe] lua: " +path + "\t pattern: " + route_pattern + "\t method: ";
+				switch (method)
+				{
+				case ylib::network::http::GET:
+					log.append("GET");
+					break;
+				case ylib::network::http::POST:
+					log.append("POST");
+					break;
+				case ylib::network::http::PUT:
+					log.append("PUT");
+					break;
+				case ylib::network::http::DEL:
+					log.append("DEL");
+					break;
+				case ylib::network::http::HEAD:
+					log.append("HEAD");
+					break;
+				case ylib::network::http::ALL:
+					log.append("ALL");
+					break;
+				default:
+					break;
+				}
+				LOG_INFO(log);
+			}
+			router->subscribe(route_pattern, method, &fastweb::subscribe_service, new std::string(sConfig->scripts.app_dir+"/" +path));
+		}
+
+	}
+#endif
 	// 加入拦截器
 	// 加入拦截器
-	for(size_t i=0;i<sConfig->website.interceptor_scripts.size();i++)
-		router->interceptor()->add(sConfig->website.interceptor_scripts[i].regex_express,&fastweb::subscribe_interceptor);
+	for (size_t i = 0; i < sConfig->website.interceptor_scripts.size(); i++)
+	{
+#if ENABLE_BYTECODE == 0
+		interceptor.emplace(sConfig->website.interceptor_scripts[i].regex_express,sConfig->website.interceptor_scripts[i].filepath);
+#endif
+		router->interceptor()->add(sConfig->website.interceptor_scripts[i].regex_express, &fastweb::subscribe_interceptor);
+	}
+		
 
 
 
 
 	router->other([&](network::http::request* request, network::http::response* response) {
 	router->other([&](network::http::request* request, network::http::response* response) {
@@ -232,10 +310,14 @@ void fastweb::subscribe_service(network::http::request* request, network::http::
 	std::string exception_string;
 	std::string exception_string;
 	try
 	try
 	{
 	{
+#if ENABLE_BYTECODE == 1
 		auto bytecode = sFastWeb->service_bytecode.get(lua_name);
 		auto bytecode = sFastWeb->service_bytecode.get(lua_name);
 		if (bytecode.empty())
 		if (bytecode.empty())
 			throw ylib::exception("Serious error: Bytecode not found, possibly due to pre compilation modification error. Please recheck the script file, "+lua_name);
 			throw ylib::exception("Serious error: Bytecode not found, possibly due to pre compilation modification error. Please recheck the script file, "+lua_name);
 		auto lbResult = lua->load_buffer(bytecode.data(), bytecode.length(), "bytecode");
 		auto lbResult = lua->load_buffer(bytecode.data(), bytecode.length(), "bytecode");
+#else
+		auto lbResult = lua->load_file(lua_name);
+#endif
 		if (lbResult.valid() == false)
 		if (lbResult.valid() == false)
 		{
 		{
 			sol::error err = lbResult;
 			sol::error err = lbResult;
@@ -276,11 +358,15 @@ bool fastweb::subscribe_interceptor(network::http::reqpack* reqpack, const std::
 	std::string exception_string;
 	std::string exception_string;
 	try
 	try
 	{
 	{
+#if ENABLE_BYTECODE == 1
 		const std::string& bytecode = sFastWeb->interceptor_bytecode.get(express_string);
 		const std::string& bytecode = sFastWeb->interceptor_bytecode.get(express_string);
 		if (bytecode.empty())
 		if (bytecode.empty())
 			throw ylib::exception("[interceptor] Serious error: Bytecode not found, possibly due to pre compilation modification error. Please recheck the script file, " + express_string);
 			throw ylib::exception("[interceptor] Serious error: Bytecode not found, possibly due to pre compilation modification error. Please recheck the script file, " + express_string);
 
 
 		auto lbResult = lua->load_buffer(bytecode.data(), bytecode.length(), "bytecode");
 		auto lbResult = lua->load_buffer(bytecode.data(), bytecode.length(), "bytecode");
+#else
+		auto lbResult = lua->load_file(sFastWeb->interceptor[express_string]);
+#endif
 		if (lbResult.valid() == false)
 		if (lbResult.valid() == false)
 		{
 		{
 			sol::error err = lbResult;
 			sol::error err = lbResult;

+ 4 - 0
src/core/fastweb.h

@@ -42,8 +42,12 @@ private:
 private:
 private:
 	network::http::center *m_center = nullptr;
 	network::http::center *m_center = nullptr;
 public:
 public:
+#if ENABLE_BYTECODE == 1
 	// 服务字节码
 	// 服务字节码
 	bytecode_manager service_bytecode;
 	bytecode_manager service_bytecode;
 	// 拦截器字节码
 	// 拦截器字节码
 	bytecode_manager interceptor_bytecode;
 	bytecode_manager interceptor_bytecode;
+#else
+	std::map<std::string, std::string> interceptor;
+#endif
 };
 };

+ 2 - 1
src/core/statemanager.cpp

@@ -21,7 +21,7 @@
 #include "module/mutex.h"
 #include "module/mutex.h"
 #include "module/codec.h"
 #include "module/codec.h"
 #include "module/time.h"
 #include "module/time.h"
-
+#include "module/file.h"
 #define LOOP_STATE_USE 1
 #define LOOP_STATE_USE 1
 bool state_manager::start()
 bool state_manager::start()
 {
 {
@@ -81,6 +81,7 @@ sol::state* state_manager::create_state()
 	module::auto_lock::regist(lua);
 	module::auto_lock::regist(lua);
 	module::codec::regist(lua);
 	module::codec::regist(lua);
 	module::time::regist(lua);
 	module::time::regist(lua);
+	module::file::regist(lua);
 
 
 	global::getInstance()->regist_lua(lua);
 	global::getInstance()->regist_lua(lua);
 	return lua;
 	return lua;

+ 29 - 0
src/module/file.cpp

@@ -0,0 +1,29 @@
+#include "file.h"
+#include "util/file.h"
+sol::table module::file::list(const std::string& dirpath, const std::string& regex, sol::this_state s)
+{
+    auto map = ylib::file::traverse(dirpath, regex);
+
+    sol::state_view lua(s);
+    sol::table result_table = lua.create_table();
+    int row_num = 1;
+
+    for_iter(iter, map)
+    {
+        sol::table row = lua.create_table();
+        row["file"] = iter->first;
+        row["type"] = (int)iter->second;
+        result_table[row_num++] = row;
+    }
+    return result_table;
+}
+void module::file::regist(sol::state* lua)
+{
+    (*lua)["IS_FILE"] = (int)ylib::FileType::IS_FILE;
+    (*lua)["IS_DIRECTORY"] = (int)ylib::FileType::IS_DIRECTORY;
+
+
+    lua->new_usertype<module::file>("file",
+        "list", &module::file::list
+    );
+}

+ 17 - 0
src/module/file.h

@@ -0,0 +1,17 @@
+#pragma once
+#include "sol/sol.hpp"
+#include "imodule.h"
+
+namespace module
+{
+	/// <summary>
+	/// 文件
+	/// </summary>
+	class file:public module::imodule {
+	public:
+		static sol::table list(const std::string& dirpath,const std::string& regex,sol::this_state s);
+		static void regist(sol::state* lua);
+	};
+
+}
+

+ 6 - 1
src/module/http/request.cpp

@@ -37,6 +37,10 @@ sol::table module::request::url_param(sol::this_state s)
         result_table[iter->first] = iter->second;
         result_table[iter->first] = iter->second;
     return result_table;
     return result_table;
 }
 }
+std::string module::request::body()
+{
+    return m_request->parser()->text();
+}
 void* module::request::website()
 void* module::request::website()
 {
 {
     return m_request->website();
     return m_request->website();
@@ -55,7 +59,8 @@ void module::request::regist(sol::state& state)
         "session", &module::request::session,
         "session", &module::request::session,
         "token", &module::request::token,
         "token", &module::request::token,
         "body_param", &module::request::body_param,
         "body_param", &module::request::body_param,
-        "url_param", &module::request::url_param
+        "url_param", &module::request::url_param,
+        "body", &module::request::body
     );
     );
     state["GET"] = (int)network::http::GET;
     state["GET"] = (int)network::http::GET;
     state["POST"] = (int)network::http::POST;
     state["POST"] = (int)network::http::POST;

+ 1 - 0
src/module/http/request.h

@@ -27,6 +27,7 @@ namespace module
         sol::table body_param(sol::this_state s);
         sol::table body_param(sol::this_state s);
         sol::table url_param(sol::this_state s);
         sol::table url_param(sol::this_state s);
 
 
+        std::string body();
         void* website();
         void* website();
 
 
         static void regist(sol::state& state);
         static void regist(sol::state& state);

+ 37 - 8
src/module/mssql.cpp

@@ -8,43 +8,70 @@ module::mssql::mssql(const std::string& connstring)
 
 
 module::mssql::~mssql()
 module::mssql::~mssql()
 {
 {
-    
+
 }
 }
 std::string module::mssql::get_str(const std::string& name)
 std::string module::mssql::get_str(const std::string& name)
 {
 {
     if (m_iter == m_rows.end())
     if (m_iter == m_rows.end())
         throw ylib::exception("no recorded data");
         throw ylib::exception("no recorded data");
-    return m_iter->get<std::string>(name);
+    std::string result;
+    result = m_iter->get<std::string>(name, result);
+    return result;
+}
+
+std::string module::mssql::get_datetime(const std::string& name)
+{
+    if (m_iter == m_rows.end())
+        throw ylib::exception("no recorded data");
+    std::tm result;
+    memset(&result, 0, sizeof(result));
+    result = m_iter->get<std::tm>(name, result);
+    if (result.tm_year != 0)
+    {
+        char buffer[80];
+        strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", &result);
+        std::string dateTimeStr(buffer);
+        return dateTimeStr;
+    }
+    return "";
 }
 }
 
 
 int32 module::mssql::get_i32(const std::string& name)
 int32 module::mssql::get_i32(const std::string& name)
 {
 {
     if (m_iter == m_rows.end())
     if (m_iter == m_rows.end())
         throw ylib::exception("no recorded data");
         throw ylib::exception("no recorded data");
-    return m_iter->get<int32>(name);
+    int32 result = 0;
+    result = m_iter->get<int32>(name, result);
+    return result;
 }
 }
 
 
 int64 module::mssql::get_i64(const std::string& name)
 int64 module::mssql::get_i64(const std::string& name)
 {
 {
     if (m_iter == m_rows.end())
     if (m_iter == m_rows.end())
         throw ylib::exception("no recorded data");
         throw ylib::exception("no recorded data");
-    return m_iter->get<int64>(name);
+    int64 result = 0;
+    result = m_iter->get<int64>(name, result);
+    return result;
 }
 }
 
 
 double module::mssql::get_dob(const std::string& name)
 double module::mssql::get_dob(const std::string& name)
 {
 {
     if (m_iter == m_rows.end())
     if (m_iter == m_rows.end())
         throw ylib::exception("no recorded data");
         throw ylib::exception("no recorded data");
-    return m_iter->get<double>(name);
+    double result = 0.0f;
+    result = m_iter->get<double>(name, result);
+    return result;
 }
 }
 void module::mssql::query(const std::string& sql)
 void module::mssql::query(const std::string& sql)
 {
 {
+    std::cout << "[mssql][query]: " << sql << std::endl;
     m_read = false;
     m_read = false;
     m_rows = (m_session->prepare << sql);
     m_rows = (m_session->prepare << sql);
     //m_iter = m_rows.begin();
     //m_iter = m_rows.begin();
 }
 }
 int64 module::mssql::update(const std::string& sql)
 int64 module::mssql::update(const std::string& sql)
 {
 {
+    std::cout << "[mssql][update]: " << sql << std::endl;
     soci::statement st = m_session->prepare << sql;
     soci::statement st = m_session->prepare << sql;
     st.execute();
     st.execute();
     return st.get_affected_rows();
     return st.get_affected_rows();
@@ -54,12 +81,13 @@ bool module::mssql::next()
     if (m_read == false)
     if (m_read == false)
     {
     {
         m_iter = m_rows.begin();
         m_iter = m_rows.begin();
-        return true;
+
+        return m_iter != m_rows.end();
     }
     }
     if (m_iter == m_rows.end())
     if (m_iter == m_rows.end())
         return false;
         return false;
     m_iter++;
     m_iter++;
-    return true;
+    return m_iter != m_rows.end();
 }
 }
 
 
 
 
@@ -73,7 +101,8 @@ void module::mssql::regist(sol::state& lua)
         "get_str", &module::mssql::get_str,
         "get_str", &module::mssql::get_str,
         "next", &module::mssql::next,
         "next", &module::mssql::next,
         "query", &module::mssql::query,
         "query", &module::mssql::query,
-        "update", &module::mssql::update
+        "update", &module::mssql::update,
+        "get_datetime", &module::mssql::get_datetime
     );
     );
 }
 }
 #endif
 #endif

+ 1 - 0
src/module/mssql.h

@@ -18,6 +18,7 @@ namespace module
 		/// 取数据
 		/// 取数据
 		/// </summary>
 		/// </summary>
 		std::string get_str(const std::string& name);
 		std::string get_str(const std::string& name);
+		std::string get_datetime(const std::string& name);
 		int32 get_i32(const std::string& name);
 		int32 get_i32(const std::string& name);
 		int64 get_i64(const std::string& name);
 		int64 get_i64(const std::string& name);
 		double get_dob(const std::string& name);
 		double get_dob(const std::string& name);

+ 31 - 5
src/module/mysql.cpp

@@ -39,6 +39,12 @@ module::select& module::select::where_expression(const std::string& expression)
     return *this;
     return *this;
 }
 }
 
 
+module::select& module::select::where_like(const std::string& name, const std::string& value)
+{
+    m_select->where_like(name, value);
+    return *this;
+}
+
 module::select& module::select::table(const std::string& table_name)
 module::select& module::select::table(const std::string& table_name)
 {
 {
     m_select->table(table_name);
     m_select->table(table_name);
@@ -79,7 +85,7 @@ module::select& module::select::orderby(const std::string& field, int sort)
 
 
 void module::select::clear()
 void module::select::clear()
 {
 {
-    m_select = nullptr;
+    m_select->clear();
 }
 }
 
 
 std::shared_ptr<module::mysql_result> module::select::query()
 std::shared_ptr<module::mysql_result> module::select::query()
@@ -108,6 +114,8 @@ void module::select::regist(sol::state& lua)
         "where_i64", &module::select::where_i64,
         "where_i64", &module::select::where_i64,
         "where_str", &module::select::where_str,
         "where_str", &module::select::where_str,
         "query", &module::select::query,
         "query", &module::select::query,
+        "clear", &module::select::clear,
+        "where_like", &module::select::where_like,
         "clear", &module::select::clear
         "clear", &module::select::clear
     );
     );
 }
 }
@@ -210,6 +218,11 @@ uint64 module::update::exec()
     return m_update->exec();
     return m_update->exec();
 }
 }
 
 
+void module::update::clear()
+{
+    m_update->clear();
+}
+
 void module::update::regist(sol::state& lua)
 void module::update::regist(sol::state& lua)
 {
 {
     lua.new_usertype<module::update>("mysql_builder_update",
     lua.new_usertype<module::update>("mysql_builder_update",
@@ -228,7 +241,8 @@ void module::update::regist(sol::state& lua)
         "set_dob", &module::update::set_dob,
         "set_dob", &module::update::set_dob,
         "set_i32", &module::update::set_i32,
         "set_i32", &module::update::set_i32,
         "set_i64", &module::update::set_i64,
         "set_i64", &module::update::set_i64,
-        "set_str", &module::update::set_str
+        "set_str", &module::update::set_str,
+        "clear", &module::update::clear
     );
     );
 }
 }
 
 
@@ -282,6 +296,11 @@ uint64 module::insert::exec()
     return m_insert->exec();
     return m_insert->exec();
 }
 }
 
 
+void module::insert::clear()
+{
+    m_insert->clear();
+}
+
 void module::insert::regist(sol::state& lua)
 void module::insert::regist(sol::state& lua)
 {
 {
     lua.new_usertype<module::insert>("mysql_builder_insert",
     lua.new_usertype<module::insert>("mysql_builder_insert",
@@ -292,7 +311,8 @@ void module::insert::regist(sol::state& lua)
         "set_dob", &module::insert::set_dob,
         "set_dob", &module::insert::set_dob,
         "set_i32", &module::insert::set_i32,
         "set_i32", &module::insert::set_i32,
         "set_i64", &module::insert::set_i64,
         "set_i64", &module::insert::set_i64,
-        "set_str", &module::insert::set_str
+        "set_str", &module::insert::set_str,
+        "clear", &module::insert::clear
     );
     );
 }
 }
 
 
@@ -365,6 +385,11 @@ uint64 module::delete_::exec()
     return m_delete->exec();
     return m_delete->exec();
 }
 }
 
 
+void module::delete_::clear()
+{
+    m_delete->clear();
+}
+
 void module::delete_::regist(sol::state& lua)
 void module::delete_::regist(sol::state& lua)
 {
 {
     lua.new_usertype<module::delete_>("mysql_builder_delete",
     lua.new_usertype<module::delete_>("mysql_builder_delete",
@@ -378,7 +403,8 @@ void module::delete_::regist(sol::state& lua)
         "where_expression", &module::delete_::where_expression,
         "where_expression", &module::delete_::where_expression,
         "where_i32", &module::delete_::where_i32,
         "where_i32", &module::delete_::where_i32,
         "where_i64", &module::delete_::where_i64,
         "where_i64", &module::delete_::where_i64,
-        "where_str", &module::delete_::where_str
+        "where_str", &module::delete_::where_str,
+        "clear", &module::delete_::clear
     );
     );
 }
 }
 
 
@@ -529,7 +555,7 @@ VarType module::mysql_result::get(sol::object obj, sol::this_state s)
         GET_VALUE(get_int32);
         GET_VALUE(get_int32);
     }
     }
       
       
-    else if (type == "varchar" || type == "char" || type == "text")
+    else if (type == "varchar" || type == "char" || type == "text" || type == "datetime")
     {
     {
         GET_VALUE(get_string);
         GET_VALUE(get_string);
     }
     }

+ 4 - 3
src/module/mysql.h

@@ -76,6 +76,7 @@ namespace module
 		module::select& where_dob(const std::string& name, const std::string& expression, double value);
 		module::select& where_dob(const std::string& name, const std::string& expression, double value);
 		module::select& where_str(const std::string& name, const std::string& expression, const std::string& value);
 		module::select& where_str(const std::string& name, const std::string& expression, const std::string& value);
 		module::select& where_expression(const std::string& expression);
 		module::select& where_expression(const std::string& expression);
+		module::select& where_like(const std::string& name,const std::string& value);
 		module::select& table(const std::string& table_name);
 		module::select& table(const std::string& table_name);
 		module::select& field(sol::table table);
 		module::select& field(sol::table table);
 		module::select& page(uint32 page, uint32 count);
 		module::select& page(uint32 page, uint32 count);
@@ -107,7 +108,7 @@ namespace module
 		module::update& limit(uint32 start, uint32 count);
 		module::update& limit(uint32 start, uint32 count);
 		module::update& orderby(const std::string& field, int sort);
 		module::update& orderby(const std::string& field, int sort);
 		uint64 exec();
 		uint64 exec();
-
+		void clear();
 		static void regist(sol::state& lua);
 		static void regist(sol::state& lua);
 	private:
 	private:
 		std::shared_ptr<ylib::update> m_update;
 		std::shared_ptr<ylib::update> m_update;
@@ -123,7 +124,7 @@ namespace module
 		module::insert& set_str(const std::string& name, const std::string& value);
 		module::insert& set_str(const std::string& name, const std::string& value);
 		module::insert& set_not_ppst(const std::string& name, const std::string& value);
 		module::insert& set_not_ppst(const std::string& name, const std::string& value);
 		uint64 exec();
 		uint64 exec();
-
+		void clear();
 		static void regist(sol::state& lua);
 		static void regist(sol::state& lua);
 	private:
 	private:
 		std::shared_ptr<ylib::insert> m_insert;
 		std::shared_ptr<ylib::insert> m_insert;
@@ -142,7 +143,7 @@ namespace module
 		module::delete_& limit(uint32 start, uint32 count);
 		module::delete_& limit(uint32 start, uint32 count);
 		module::delete_& orderby(const std::string& field, int sort);
 		module::delete_& orderby(const std::string& field, int sort);
 		uint64 exec();
 		uint64 exec();
-
+		void clear();
 		static void regist(sol::state& lua);
 		static void regist(sol::state& lua);
 	private:
 	private:
 		std::shared_ptr <ylib::delete_> m_delete;
 		std::shared_ptr <ylib::delete_> m_delete;