diff --git a/src/config/ConfigManager.hpp b/src/config/ConfigManager.hpp index 8586ec89..3d545bc4 100644 --- a/src/config/ConfigManager.hpp +++ b/src/config/ConfigManager.hpp @@ -15,12 +15,11 @@ #include "../Window.hpp" #include "../helpers/WLClasses.hpp" #include "../helpers/Monitor.hpp" +#include "../helpers/VarList.hpp" #include "defaultConfig.hpp" #include "ConfigDataValues.hpp" -#define STRVAL_EMPTY "[[EMPTY]]" - #define INITANIMCFG(name) animationConfig[name] = {} #define CREATEANIMCFG(name, parent) animationConfig[name] = {false, "", "", 0.f, -1, &animationConfig["global"], &animationConfig[parent]} @@ -75,73 +74,6 @@ struct SExecRequestedRule { uint64_t iPid = 0; }; -class CVarList { - public: - /* passing 's' as a separator will use std::isspace */ - CVarList(const std::string& in, long unsigned int lastArgNo = 0, const char separator = ',') { - std::string curitem = ""; - std::string argZ = in; - const bool SPACESEP = separator == 's'; - - auto nextItem = [&]() { - auto idx = lastArgNo != 0 && m_vArgs.size() >= lastArgNo - 1 ? std::string::npos : ([&]() -> size_t { - if (!SPACESEP) - return argZ.find_first_of(separator); - - uint64_t pos = -1; - while (!std::isspace(argZ[++pos]) && pos < argZ.length()) - ; - - return pos < argZ.length() ? pos : std::string::npos; - }()); - - if (idx != std::string::npos) { - curitem = argZ.substr(0, idx); - argZ = argZ.substr(idx + 1); - } else { - curitem = argZ; - argZ = STRVAL_EMPTY; - } - }; - - nextItem(); - - while (curitem != STRVAL_EMPTY) { - m_vArgs.push_back(removeBeginEndSpacesTabs(curitem)); - nextItem(); - } - }; - - ~CVarList() = default; - - size_t size() const { - return m_vArgs.size(); - } - - std::string operator[](const long unsigned int& idx) const { - if (idx >= m_vArgs.size()) - return ""; - return m_vArgs[idx]; - } - - // for range-based loops - std::vector::iterator begin() { - return m_vArgs.begin(); - } - std::vector::const_iterator begin() const { - return m_vArgs.begin(); - } - std::vector::iterator end() { - return m_vArgs.end(); - } - std::vector::const_iterator end() const { - return m_vArgs.end(); - } - - private: - std::vector m_vArgs; -}; - class CConfigManager { public: CConfigManager(); diff --git a/src/helpers/VarList.cpp b/src/helpers/VarList.cpp new file mode 100644 index 00000000..0da86e15 --- /dev/null +++ b/src/helpers/VarList.cpp @@ -0,0 +1,46 @@ +#include "VarList.hpp" + +CVarList::CVarList(const std::string& in, long unsigned int lastArgNo, const char separator) { + std::string curitem = ""; + std::string argZ = in; + const bool SPACESEP = separator == 's'; + + auto nextItem = [&]() { + auto idx = lastArgNo != 0 && m_vArgs.size() >= lastArgNo - 1 ? std::string::npos : ([&]() -> size_t { + if (!SPACESEP) + return argZ.find_first_of(separator); + + uint64_t pos = -1; + while (!std::isspace(argZ[++pos]) && pos < argZ.length()) + ; + + return pos < argZ.length() ? pos : std::string::npos; + }()); + + if (idx != std::string::npos) { + curitem = argZ.substr(0, idx); + argZ = argZ.substr(idx + 1); + } else { + curitem = argZ; + argZ = STRVAL_EMPTY; + } + }; + + nextItem(); + + while (curitem != STRVAL_EMPTY) { + m_vArgs.push_back(removeBeginEndSpacesTabs(curitem)); + nextItem(); + } +} + +std::string CVarList::join(const std::string& joiner, size_t from, size_t to) const { + size_t last = to == 0 ? size() : to; + + std::string rolling; + for (size_t i = from; i < last; ++i) { + rolling += m_vArgs[i] + (i + 1 < last ? joiner : ""); + } + + return rolling; +} \ No newline at end of file diff --git a/src/helpers/VarList.hpp b/src/helpers/VarList.hpp new file mode 100644 index 00000000..0c83a3db --- /dev/null +++ b/src/helpers/VarList.hpp @@ -0,0 +1,41 @@ +#pragma once +#include +#include +#include "../macros.hpp" + +class CVarList { + public: + /* passing 's' as a separator will use std::isspace */ + CVarList(const std::string& in, long unsigned int lastArgNo = 0, const char separator = ','); + + ~CVarList() = default; + + size_t size() const { + return m_vArgs.size(); + } + + std::string join(const std::string& joiner, size_t from = 0, size_t to = 0) const; + + std::string operator[](const long unsigned int& idx) const { + if (idx >= m_vArgs.size()) + return ""; + return m_vArgs[idx]; + } + + // for range-based loops + std::vector::iterator begin() { + return m_vArgs.begin(); + } + std::vector::const_iterator begin() const { + return m_vArgs.begin(); + } + std::vector::iterator end() { + return m_vArgs.end(); + } + std::vector::const_iterator end() const { + return m_vArgs.end(); + } + + private: + std::vector m_vArgs; +}; \ No newline at end of file diff --git a/src/macros.hpp b/src/macros.hpp index 53f77fdf..3f0a9ebc 100644 --- a/src/macros.hpp +++ b/src/macros.hpp @@ -37,6 +37,8 @@ #define PI 3.14159265358979 +#define STRVAL_EMPTY "[[EMPTY]]" + #define LISTENER(name) \ void listener_##name(wl_listener*, void*); \ inline wl_listener listen_##name = {.notify = listener_##name}