12 #include <epicsConvert.h> 15 #include <pv/pvType.h> 16 #include <pv/pvIntrospect.h> 17 #include <pv/templateMeta.h> 20 namespace epics {
namespace pvData {
25 epicsShareExtern
void parseToPOD(
const char*, boolean *out);
26 epicsShareExtern
void parseToPOD(
const char*, int8 *out);
27 epicsShareExtern
void parseToPOD(
const char*, uint8 *out);
28 epicsShareExtern
void parseToPOD(
const char*, int16_t *out);
29 epicsShareExtern
void parseToPOD(
const char*, uint16_t *out);
30 epicsShareExtern
void parseToPOD(
const char*, int32_t *out);
31 epicsShareExtern
void parseToPOD(
const char*, uint32_t *out);
32 epicsShareExtern
void parseToPOD(
const char*, int64_t *out);
33 epicsShareExtern
void parseToPOD(
const char*, uint64_t *out);
34 epicsShareExtern
void parseToPOD(
const char*,
float *out);
35 epicsShareExtern
void parseToPOD(
const char*,
double *out);
37 static inline void parseToPOD(
const std::string& str, boolean *out) {
return parseToPOD(str.c_str(), out); }
38 static inline void parseToPOD(
const std::string& str, int8 *out) {
return parseToPOD(str.c_str(), out); }
39 static inline void parseToPOD(
const std::string& str, uint8 *out) {
return parseToPOD(str.c_str(), out); }
40 static inline void parseToPOD(
const std::string& str, int16_t *out) {
return parseToPOD(str.c_str(), out); }
41 static inline void parseToPOD(
const std::string& str, uint16_t *out) {
return parseToPOD(str.c_str(), out); }
42 static inline void parseToPOD(
const std::string& str, int32_t *out) {
return parseToPOD(str.c_str(), out); }
43 static inline void parseToPOD(
const std::string& str, uint32_t *out) {
return parseToPOD(str.c_str(), out); }
44 static inline void parseToPOD(
const std::string& str, int64_t *out) {
return parseToPOD(str.c_str(), out); }
45 static inline void parseToPOD(
const std::string& str, uint64_t *out) {
return parseToPOD(str.c_str(), out); }
46 static inline void parseToPOD(
const std::string& str,
float *out) {
return parseToPOD(str.c_str(), out); }
47 static inline void parseToPOD(
const std::string& str,
double *out) {
return parseToPOD(str.c_str(), out); }
52 template<
typename ARG>
55 struct cast_arg<std::string> {
typedef const std::string& arg; };
61 static FORCE_INLINE return_t op(
const T& i) {
return i; }
66 struct print_convolute<int8> {
67 typedef signed int return_t;
71 struct print_convolute<uint8> {
72 typedef unsigned int return_t;
77 struct print_convolute<boolean> {
78 typedef const char* return_t;
79 static FORCE_INLINE return_t op(boolean i) {
return i ?
"true" :
"false"; }
84 template<
typename TO,
typename FROM,
class Enable =
void>
87 return static_cast<TO>(from);
93 struct cast_helper<
float,
double> {
95 return epicsConvertDoubleToFloat(from);
101 template<
typename FROM>
102 struct cast_helper<std::string, FROM,
typename meta::not_same_type<std::string,FROM>::type> {
103 static std::string op(FROM from) {
104 std::ostringstream strm;
105 strm << print_convolute<FROM>::op(from);
107 throw std::runtime_error(
"Cast to string failed");
114 template<
typename TO>
115 struct cast_helper<TO, std::string,
typename meta::not_same_type<TO,std::string>::type> {
118 parseToPOD(from, &ret);
125 template<
typename TO>
126 struct cast_helper<TO,
const char*,
128 typename meta::not_same_type<TO,
const char*>,
129 typename meta::not_same_type<TO,std::string>
133 parseToPOD(from, &ret);
194 template<
typename TO,
typename FROM>
197 return detail::cast_helper<TO,FROM>::op(from);
241 const std::string& s;
242 maybeQuote(
const std::string& s) :s(s) {}
epicsShareFunc bool yajl_parse_helper(std::istream &src, yajl_handle handle)