CoolProp 6.8.1dev
An open-source fluid property and humid air property database
CoolPropTools.h
Go to the documentation of this file.
1#ifndef COOLPROPTOOLS_H
2#define COOLPROPTOOLS_H
3
4#ifndef _CRT_SECURE_NO_WARNINGS
5# define _CRT_SECURE_NO_WARNINGS
6#endif
7
9#include "Exceptions.h"
10#include <string>
11#include <vector>
12#include <cctype>
13#include <map>
14
15#include "CPstrings.h"
16#include "CPnumerics.h"
17#include "CPfilepaths.h"
18
19#ifndef __has_feature // Optional of course.
20# define __has_feature(x) 0 // Compatibility with non-clang compilers.
21#endif
22
23#ifdef __EMSCRIPTEN__
24# define thread_local
25#endif
26
27// see http://stackoverflow.com/questions/18298280/how-to-declare-a-variable-as-thread-local-portably
28#ifndef thread_local
29# if __STDC_VERSION__ >= 201112 && !defined __STDC_NO_THREADS__
30# define thread_local _Thread_local
31# elif defined _WIN32 && (defined _MSC_VER || defined __ICL || defined __DMC__ || defined __BORLANDC__)
32# define thread_local __declspec(thread)
33# elif defined(__ISAPPLE__) && (defined(__llvm__) || defined(__clang__)) && !__has_feature(cxx_thread_local)
34# define thread_local
35/* note that ICC (linux) and Clang are covered by __GNUC__ */
36# elif defined __GNUC__ || defined __SUNPRO_C || defined __xlC__
37# define thread_local __thread
38# else
39# error "Cannot define thread_local"
40// #define thread_local
41# endif
42#endif
43
44#define COOLPROPDBL_MAPS_TO_DOUBLE
45#ifdef COOLPROPDBL_MAPS_TO_DOUBLE
46typedef double CoolPropDbl;
47#else
48typedef long double CoolPropDbl;
49#endif
50
52#ifdef __GNUC__
53# define DEPRECATED(func) func __attribute__((deprecated))
54#elif defined(_MSC_VER)
55# define DEPRECATED(func) __declspec(deprecated) func
56#else
57# pragma message("WARNING: You need to implement DEPRECATED for this compiler")
58# define DEPRECATED(func) func
59#endif
60
62{
63 private:
64 typedef std::map<std::string, double> numbers_map;
65 numbers_map numbers;
66 typedef std::map<std::string, std::string> strings_map;
67 strings_map strings;
68 typedef std::map<std::string, std::vector<double>> double_vectors_map;
69 double_vectors_map double_vectors;
70 typedef std::map<std::string, std::vector<std::string>> string_vectors_map;
71 string_vectors_map string_vectors;
72
73 public:
75 bool is_empty(void) const {
76 return numbers.empty() && strings.empty() && double_vectors.empty() && string_vectors.empty();
77 }
78 void add_string(const std::string& s1, const std::string& s2) {
79 strings.insert(std::pair<std::string, std::string>(s1, s2));
80 }
81 void add_number(const std::string& s1, double d) {
82 numbers.erase(s1);
83 numbers.insert(std::pair<std::string, double>(s1, d));
84 }
85 bool has_number(const std::string& s1) {
86 return numbers.find(s1) != numbers.end();
87 }
88 void add_double_vector(const std::string& s1, const std::vector<double>& d) {
89 double_vectors.insert(std::pair<std::string, std::vector<double>>(s1, d));
90 }
91 void add_string_vector(const std::string& s1, const std::vector<std::string>& d) {
92 string_vectors.insert(std::pair<std::string, std::vector<std::string>>(s1, d));
93 }
94 std::string get_string(const std::string& s) const {
95 strings_map::const_iterator i = strings.find(s);
96 if (i != strings.end()) {
97 return i->second;
98 } else {
99 throw CoolProp::ValueError(format("%s could not be matched in get_string", s.c_str()));
100 }
101 };
102 double get_double(const std::string& s) const {
103 numbers_map::const_iterator i = numbers.find(s);
104 if (i != numbers.end()) {
105 return i->second;
106 } else {
107 throw CoolProp::ValueError(format("%s could not be matched in get_number", s.c_str()));
108 }
109 };
111 double get_double(const std::string& s, const double default_value) const {
112 numbers_map::const_iterator i = numbers.find(s);
113 if (i != numbers.end()) {
114 return i->second;
115 } else {
116 return default_value;
117 }
118 };
119 double get_number(const std::string& s) const {
120 return get_double(s);
121 };
122 const std::vector<double>& get_double_vector(const std::string& s) const {
123 double_vectors_map::const_iterator i = double_vectors.find(s);
124 if (i != double_vectors.end()) {
125 return i->second;
126 } else {
127 throw CoolProp::ValueError(format("%s could not be matched in get_double_vector", s.c_str()));
128 }
129 };
130 const std::vector<std::string>& get_string_vector(const std::string& s) const {
131 string_vectors_map::const_iterator i = string_vectors.find(s);
132 if (i != string_vectors.end()) {
133 return i->second;
134 } else {
135 throw CoolProp::ValueError(format("%s could not be matched in get_string_vector", s.c_str()));
136 }
137 };
138};
140//http://stackoverflow.com/questions/569110/why-is-memory-still-accessible-after-stdmapclear-is-called
141template <typename M>
142void freeClear(M& amap) {
143 for (typename M::iterator it = amap.begin(); it != amap.end(); ++it) {
144 delete it->second;
145 }
146 amap.clear();
147}
148
149#define CATCH_ALL_ERRORS_RETURN_HUGE(x) \
150 try { \
151 x \
152 } catch (const std::exception& e) { \
153 return _HUGE; \
154 } catch (...) { \
155 return _HUGE; \
156 }
157
159{
163void miniz(const std::string& inFile, const std::string& outFile, miniz_mode mode);
164#endif