chaiscript_defines.hpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. // This file is distributed under the BSD License.
  2. // See "license.txt" for details.
  3. // Copyright 2009-2012, Jonathan Turner ([email protected])
  4. // Copyright 2009-2017, Jason Turner ([email protected])
  5. // http://www.chaiscript.com
  6. #ifndef CHAISCRIPT_DEFINES_HPP_
  7. #define CHAISCRIPT_DEFINES_HPP_
  8. #ifdef _MSC_VER
  9. #define CHAISCRIPT_STRINGIZE(x) "" #x
  10. #define CHAISCRIPT_STRINGIZE_EXPANDED(x) CHAISCRIPT_STRINGIZE(x)
  11. #define CHAISCRIPT_COMPILER_VERSION CHAISCRIPT_STRINGIZE_EXPANDED(_MSC_FULL_VER)
  12. #define CHAISCRIPT_MSVC _MSC_VER
  13. #define CHAISCRIPT_HAS_DECLSPEC
  14. static_assert(_MSC_FULL_VER >= 190024210, "Visual C++ 2015 Update 3 or later required");
  15. #else
  16. #define CHAISCRIPT_COMPILER_VERSION __VERSION__
  17. #endif
  18. #include <vector>
  19. #if defined( _LIBCPP_VERSION )
  20. #define CHAISCRIPT_LIBCPP
  21. #endif
  22. #if defined(_WIN32) || defined(__CYGWIN__)
  23. #define CHAISCRIPT_WINDOWS
  24. #endif
  25. #if defined(_WIN32)
  26. #if defined(__llvm__)
  27. #define CHAISCRIPT_COMPILER_NAME "clang(windows)"
  28. #elif defined(__GNUC__)
  29. #define CHAISCRIPT_COMPILER_NAME "gcc(mingw)"
  30. #else
  31. #define CHAISCRIPT_COMPILER_NAME "msvc"
  32. #endif
  33. #else
  34. #if defined(__llvm__)
  35. #define CHAISCRIPT_COMPILER_NAME "clang"
  36. #elif defined(__GNUC__)
  37. #define CHAISCRIPT_COMPILER_NAME "gcc"
  38. #else
  39. #define CHAISCRIPT_COMPILER_NAME "unknown"
  40. #endif
  41. #endif
  42. #if defined(__llvm__)
  43. #define CHAISCRIPT_CLANG
  44. #endif
  45. #ifdef CHAISCRIPT_HAS_DECLSPEC
  46. #define CHAISCRIPT_MODULE_EXPORT extern "C" __declspec(dllexport)
  47. #else
  48. #define CHAISCRIPT_MODULE_EXPORT extern "C"
  49. #endif
  50. #if defined(CHAISCRIPT_MSVC) || (defined(__GNUC__) && __GNUC__ >= 5) || defined(CHAISCRIPT_CLANG)
  51. #define CHAISCRIPT_UTF16_UTF32
  52. #endif
  53. #ifdef _DEBUG
  54. #define CHAISCRIPT_DEBUG true
  55. #else
  56. #define CHAISCRIPT_DEBUG false
  57. #endif
  58. #include <memory>
  59. #include <string>
  60. #include <cmath>
  61. namespace chaiscript {
  62. static const int version_major = 6;
  63. static const int version_minor = 0;
  64. static const int version_patch = 0;
  65. static const char *compiler_version = CHAISCRIPT_COMPILER_VERSION;
  66. static const char *compiler_name = CHAISCRIPT_COMPILER_NAME;
  67. static const bool debug_build = CHAISCRIPT_DEBUG;
  68. template<typename B, typename D, typename ...Arg>
  69. inline std::shared_ptr<B> make_shared(Arg && ... arg)
  70. {
  71. #ifdef CHAISCRIPT_USE_STD_MAKE_SHARED
  72. return std::make_shared<D>(std::forward<Arg>(arg)...);
  73. #else
  74. return std::shared_ptr<B>(static_cast<B*>(new D(std::forward<Arg>(arg)...)));
  75. #endif
  76. }
  77. template<typename B, typename D, typename ...Arg>
  78. inline std::unique_ptr<B> make_unique(Arg && ... arg)
  79. {
  80. #ifdef CHAISCRIPT_USE_STD_MAKE_SHARED
  81. return std::make_unique<D>(std::forward<Arg>(arg)...);
  82. #else
  83. return std::unique_ptr<B>(static_cast<B*>(new D(std::forward<Arg>(arg)...)));
  84. #endif
  85. }
  86. struct Build_Info {
  87. static int version_major()
  88. {
  89. return chaiscript::version_major;
  90. }
  91. static int version_minor()
  92. {
  93. return chaiscript::version_minor;
  94. }
  95. static int version_patch()
  96. {
  97. return chaiscript::version_patch;
  98. }
  99. static std::string version()
  100. {
  101. return std::to_string(version_major()) + '.' + std::to_string(version_minor()) + '.' + std::to_string(version_patch());
  102. }
  103. static std::string compiler_id()
  104. {
  105. return compiler_name() + '-' + compiler_version();
  106. }
  107. static std::string build_id()
  108. {
  109. return compiler_id() + (debug_build()?"-Debug":"-Release");
  110. }
  111. static std::string compiler_version()
  112. {
  113. return chaiscript::compiler_version;
  114. }
  115. static std::string compiler_name()
  116. {
  117. return chaiscript::compiler_name;
  118. }
  119. static bool debug_build()
  120. {
  121. return chaiscript::debug_build;
  122. }
  123. };
  124. template<typename T>
  125. auto parse_num(const char *t_str) -> typename std::enable_if<std::is_integral<T>::value, T>::type
  126. {
  127. T t = 0;
  128. for (char c = *t_str; (c = *t_str) != 0; ++t_str) {
  129. if (c < '0' || c > '9') {
  130. return t;
  131. }
  132. t *= 10;
  133. t += c - '0';
  134. }
  135. return t;
  136. }
  137. template<typename T>
  138. auto parse_num(const char *t_str) -> typename std::enable_if<!std::is_integral<T>::value, T>::type
  139. {
  140. T t = 0;
  141. T base = 0;
  142. T decimal_place = 0;
  143. bool exponent = false;
  144. bool neg_exponent = false;
  145. const auto final_value = [](const T val, const T baseval, const bool hasexp, const bool negexp) -> T {
  146. if (!hasexp) {
  147. return val;
  148. } else {
  149. return baseval * std::pow(T(10), val*T(negexp?-1:1));
  150. }
  151. };
  152. for(; *t_str != '\0'; ++t_str) {
  153. char c = *t_str;
  154. if (c == '.') {
  155. decimal_place = 10;
  156. } else if (c == 'e' || c == 'E') {
  157. exponent = true;
  158. decimal_place = 0;
  159. base = t;
  160. t = 0;
  161. } else if (c == '-' && exponent) {
  162. neg_exponent = true;
  163. } else if (c == '+' && exponent) {
  164. neg_exponent = false;
  165. } else if (c < '0' || c > '9') {
  166. return final_value(t, base, exponent, neg_exponent);
  167. } else if (decimal_place < T(10)) {
  168. t *= T(10);
  169. t += T(c - '0');
  170. } else {
  171. t += (T(c - '0') / (T(decimal_place)));
  172. decimal_place *= 10;
  173. }
  174. }
  175. return final_value(t, base, exponent, neg_exponent);
  176. }
  177. template<typename T>
  178. T parse_num(const std::string &t_str)
  179. {
  180. return parse_num<T>(t_str.c_str());
  181. }
  182. enum class Options
  183. {
  184. No_Load_Modules,
  185. Load_Modules,
  186. No_External_Scripts,
  187. External_Scripts
  188. };
  189. static inline std::vector<Options> default_options()
  190. {
  191. #ifdef CHAISCRIPT_NO_DYNLOAD
  192. return {Options::No_Load_Modules, Options::External_Scripts};
  193. #else
  194. return {Options::Load_Modules, Options::External_Scripts};
  195. #endif
  196. }
  197. }
  198. #endif