Explorar o código

refactor & feat: Env-Var使用STL哈希表

SongZihuan %!s(int64=3) %!d(string=hai) anos
pai
achega
8c448ee019
Modificáronse 3 ficheiros con 40 adicións e 88 borrados
  1. 5 7
      include/core/env-var.h
  2. 1 1
      include/core/env-var.inline.h
  3. 34 80
      src/core/env-var.cpp

+ 5 - 7
include/core/env-var.h

@@ -1,5 +1,6 @@
 #ifndef AFUN_ENV_VAR_H
 #define AFUN_ENV_VAR_H
+#include <unordered_map>
 #include "aFuntool.h"
 #include "aFunCoreExport.h"
 #include "shared_mutex"
@@ -7,8 +8,8 @@
 namespace aFuncore {
     class AFUN_CORE_EXPORT EnvVarSpace {  // 环境变量
     public:
-        EnvVarSpace();
-        ~EnvVarSpace();
+        EnvVarSpace() = default;
+        ~EnvVarSpace() = default;
         EnvVarSpace(const EnvVarSpace &)=delete;
         EnvVarSpace &operator=(const EnvVarSpace &)=delete;
 
@@ -26,16 +27,13 @@ namespace aFuncore {
         static const size_t ENV_VAR_HASH_SIZE = 100;  // 环境变量哈希表大小
         struct EnvVar;
 
-        size_t count;
-        EnvVar *var[ENV_VAR_HASH_SIZE] {};
+        std::unordered_map<std::string, EnvVar> var;
         std::shared_mutex lock;
     };
 
     struct EnvVarSpace::EnvVar {  // 环境变量
-        std::string name;
         std::string str;
-        int32_t num = 0;  // 可以同时记录字符串和数字
-        struct EnvVar *next = nullptr;
+        int32_t num;  // 可以同时记录字符串和数字
     };
 }
 

+ 1 - 1
include/core/env-var.inline.h

@@ -4,7 +4,7 @@
 
 namespace aFuncore {
     inline size_t EnvVarSpace::getCount() const{
-        return count;
+        return var.size();
     }
 }
 

+ 34 - 80
src/core/env-var.cpp

@@ -1,25 +1,5 @@
 #include "env-var.h"
 namespace aFuncore {
-
-    /**
-     * 创建环境变量
-     */
-    EnvVarSpace::EnvVarSpace() : count{0}{
-
-    }
-
-    /**
-     * 释放全部环境变量
-     */
-    EnvVarSpace::~EnvVarSpace(){
-        for (auto &i: var) {
-            for (EnvVar *tmp = i, *next; tmp != nullptr; tmp = next) {
-                next = tmp->next;
-                delete tmp;
-            }
-        }
-    }
-
     /**
      * 获取环境变量文本
      * @param name 变量名
@@ -27,14 +7,13 @@ namespace aFuncore {
      * @return 是否成功
      */
     bool EnvVarSpace::findString(const std::string &name, std::string &str) const{
-        size_t index = aFuntool::time33(name) % ENV_VAR_HASH_SIZE;
-        for (auto tmp = var[index]; tmp != nullptr; tmp = tmp->next) {
-            if (name == tmp->name) {
-                str = tmp->str;
-                return true;
-            }
+        try {
+            auto &env_var = var.at(name);
+            str = env_var.str;
+            return true;
+        } catch (std::out_of_range &) {
+            return false;
         }
-        return false;
     }
 
     /**
@@ -44,14 +23,13 @@ namespace aFuncore {
      * @return 是否成功
      */
     bool EnvVarSpace::findNumber(const std::string &name, int32_t &num) const{
-        size_t index = aFuntool::time33(name) % ENV_VAR_HASH_SIZE;
-        for (auto tmp = var[index]; tmp != nullptr; tmp = tmp->next) {
-            if (name == tmp->name) {
-                num = tmp->num;
-                return true;
-            }
+        try {
+            auto &env_var = var.at(name);
+            num = env_var.num;
+            return true;
+        } catch (std::out_of_range &) {
+            return false;
         }
-        return false;
     }
 
     /**
@@ -60,18 +38,12 @@ namespace aFuncore {
      * @param str 文本
      */
     void EnvVarSpace::setString(const std::string &name, const std::string &str){
-        size_t index = aFuntool::time33(name) % ENV_VAR_HASH_SIZE;
-        auto tmp = &var[index];
-        for (NULL; *tmp != nullptr; tmp = &((*tmp)->next)) {
-            if (name == (*tmp)->name) {
-                (*tmp)->str = str;
-                return;
-            }
+        try {
+            auto &env_var = var.at(name);
+            env_var.str = str;
+        } catch (std::out_of_range &) {
+            var.insert({name, {str, 0}});
         }
-
-        (*tmp) = new EnvVar;
-        (*tmp)->name = name;
-        (*tmp)->str = str;
     }
 
     /**
@@ -80,57 +52,39 @@ namespace aFuncore {
      * @param num 数值
      */
     void EnvVarSpace::setNumber(const std::string &name, int32_t num){
-        size_t index = aFuntool::time33(name) % ENV_VAR_HASH_SIZE;
-        auto tmp = &var[index];
-        for (NULL; *tmp != nullptr; tmp = &((*tmp)->next)) {
-            if (name == (*tmp)->name) {
-                (*tmp)->num = num;
-                return;
-            }
+        try {
+            auto &env_var = var.at(name);
+            env_var.num = num;
+        } catch (std::out_of_range &) {
+            var.insert({name, {"", num}});
         }
-
-        (*tmp) = new EnvVar;
-        (*tmp)->name = name;
-        (*tmp)->num = num;
     }
 
     /**
-     * 设置环境变量文本
+     * 设置环境变量文本 (加法)
      * @param name 变量名
      * @param str 文本
      */
     void EnvVarSpace::addString(const std::string &name, const std::string &str){
-        size_t index = aFuntool::time33(name) % ENV_VAR_HASH_SIZE;
-        auto tmp = &var[index];
-        for (NULL; *tmp != nullptr; tmp = &((*tmp)->next)) {
-            if (name == (*tmp)->name) {
-                (*tmp)->str += str;
-                return;
-            }
+        try {
+            auto &env_var = var.at(name);
+            env_var.str += str;
+        } catch (std::out_of_range &) {
+            var.insert({name, {str, 0}});
         }
-
-        (*tmp) = new EnvVar;
-        (*tmp)->name = name;
-        (*tmp)->str = str;
     }
 
     /**
-     * 设置环境变量数值
+     * 设置环境变量数值 (加法)
      * @param name 变量名
      * @param num 数值
      */
     void EnvVarSpace::addNumber(const std::string &name, int32_t num){
-        size_t index = aFuntool::time33(name) % ENV_VAR_HASH_SIZE;
-        auto tmp = &var[index];
-        for (NULL; *tmp != nullptr; tmp = &((*tmp)->next)) {
-            if (name == (*tmp)->name) {
-                (*tmp)->num += num;
-                return;
-            }
+        try {
+            auto &env_var = var.at(name);
+            env_var.num += num;
+        } catch (std::out_of_range &) {
+            var.insert({name, {"", num}});
         }
-
-        (*tmp) = new EnvVar;
-        (*tmp)->name = name;
-        (*tmp)->num = num;
     }
 }