diff --git a/CMakeLists.txt b/CMakeLists.txt index 78dfc613..c7911466 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,6 @@ option(BUILD_SAMPLES "Build Samples Folder" FALSE) option(RUN_FUZZY_TESTS "Run tests generated by AFL" FALSE) option(USE_STD_MAKE_SHARED "Use std::make_shared instead of chaiscript::make_shared" FALSE) option(RUN_PERFORMANCE_TESTS "Run Performance Tests" FALSE) -option(BUILD_IN_CPP17_MODE "Build with C++17 flags" FALSE) mark_as_advanced(USE_STD_MAKE_SHARED) @@ -150,21 +149,7 @@ endif() if(CMAKE_COMPILER_IS_GNUCC) execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) - if(GCC_VERSION VERSION_LESS 4.9) - set(CPP14_FLAG "-std=c++1y") - else() - if (BUILD_IN_CPP17_MODE) - set(CPP14_FLAG "-std=c++1z") - else() - set(CPP14_FLAG "-std=c++14") - endif() - endif() -else() - if (BUILD_IN_CPP17_MODE) - set(CPP14_FLAG "-std=c++1z") - else() - set(CPP14_FLAG "-std=c++14") - endif() + set(CPP17_FLAG "-std=c++1z") endif() if(MSVC) @@ -188,7 +173,7 @@ if(MSVC) # how to workaround or fix the error. So I'm disabling it globally. add_definitions(/wd4503) else() - add_definitions(-Wall -Wextra -Wconversion -Wshadow -Wnon-virtual-dtor -Wold-style-cast -Wcast-align -Wcast-qual -Wunused -Woverloaded-virtual -Wno-noexcept-type -Wpedantic ${CPP14_FLAG}) + add_definitions(-Wall -Wextra -Wconversion -Wshadow -Wnon-virtual-dtor -Wold-style-cast -Wcast-align -Wcast-qual -Wunused -Woverloaded-virtual -Wno-noexcept-type -Wpedantic ${CPP17_FLAG}) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") add_definitions(-Weverything -Wno-c++98-compat-pedantic -Wno-c++98-compat -Wno-documentation -Wno-switch-enum -Wno-weak-vtables -Wno-missing-prototypes -Wno-padded -Wno-missing-noreturn -Wno-exit-time-destructors -Wno-documentation-unknown-command -Wno-unused-template -Wno-undef ) @@ -206,12 +191,12 @@ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") if(USE_LIBCXX) add_definitions(-stdlib=libc++) - set(LINKER_FLAGS "${LINKER_FLAGS} ${CPP14_FLAG} -stdlib=libc++") + set(LINKER_FLAGS "${LINKER_FLAGS} ${CPP17_FLAG} -stdlib=libc++") else() - set(LINKER_FLAGS "${LINKER_FLAGS} ${CPP14_FLAG}") + set(LINKER_FLAGS "${LINKER_FLAGS} ${CPP17_FLAG}") endif() elseif(CMAKE_COMPILER_IS_GNUCC) - set(LINKER_FLAGS "${LINKER_FLAGS} ${CPP14_FLAG}") + set(LINKER_FLAGS "${LINKER_FLAGS} ${CPP17_FLAG}") endif() # limitations in MinGW require us to make an optimized build diff --git a/include/chaiscript/chaiscript_defines.hpp b/include/chaiscript/chaiscript_defines.hpp index 1fe3a512..7bac2681 100644 --- a/include/chaiscript/chaiscript_defines.hpp +++ b/include/chaiscript/chaiscript_defines.hpp @@ -168,6 +168,49 @@ namespace chaiscript { } + template + [[nodiscard]] auto parse_num(const std::string_view &t_str) noexcept + -> typename std::enable_if::value, T>::type + { + T t = 0; + T base = 0; + T decimal_place = 0; + bool exponent = false; + bool neg_exponent = false; + + const auto final_value = [](const T val, const T baseval, const bool hasexp, const bool negexp) -> T { + if (!hasexp) { + return val; + } else { + return baseval * std::pow(T(10), val*T(negexp?-1:1)); + } + }; + + for (const auto c : t_str) { + if (c == '.') { + decimal_place = 10; + } else if (c == 'e' || c == 'E') { + exponent = true; + decimal_place = 0; + base = t; + t = 0; + } else if (c == '-' && exponent) { + neg_exponent = true; + } else if (c == '+' && exponent) { + neg_exponent = false; + } else if (c < '0' || c > '9') { + return final_value(t, base, exponent, neg_exponent); + } else if (decimal_place < T(10)) { + t *= T(10); + t += T(c - '0'); + } else { + t += (T(c - '0') / (T(decimal_place))); + decimal_place *= 10; + } + } + + return final_value(t, base, exponent, neg_exponent); + } template auto parse_num(const char *t_str) -> typename std::enable_if::value, T>::type diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index 3dce4a76..aa34e505 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -200,7 +200,8 @@ namespace chaiscript m_engine.add(fun([this](const Boxed_Value &t_bv, const std::string &t_name){ add_global(t_bv, t_name); }), "add_global"); m_engine.add(fun([this](const Boxed_Value &t_bv, const std::string &t_name){ set_global(t_bv, t_name); }), "set_global"); - m_engine.add(fun([this](const std::string& t_namespace_name) { register_namespace([](Namespace& space) {}, t_namespace_name); import(t_namespace_name); }), "namespace"); + // why this unused parameter to Namesapce? + m_engine.add(fun([this](const std::string& t_namespace_name) { register_namespace([](Namespace& ) {}, t_namespace_name); import(t_namespace_name); }), "namespace"); m_engine.add(fun([this](const std::string& t_namespace_name) { import(t_namespace_name); }), "import"); } diff --git a/include/chaiscript/utility/json.hpp b/include/chaiscript/utility/json.hpp index d227d85e..f5583033 100644 --- a/include/chaiscript/utility/json.hpp +++ b/include/chaiscript/utility/json.hpp @@ -50,11 +50,11 @@ class JSON private: - using Data = std::variant, std::vector, std::string, double, int64_t, bool>; + using Data = std::variant, std::vector, std::string, double, int64_t, bool>; struct Internal { - Internal(nullptr_t) : d(nullptr) { } + Internal(std::nullptr_t) : d(nullptr) { } Internal() : d(nullptr) { } Internal(Class c) : d(make_type(c)) { } template Internal(T t) : d(std::move(t)) { } @@ -96,7 +96,7 @@ class JSON template auto &get_set_type() { set_type(ClassValue); - return std::get(ClassValue)>(d); + return (std::get(ClassValue)>(d)); } auto &Map() {