OpendTect  6.6
gason.h
Go to the documentation of this file.
1 #pragma once
2 
3 /*
4  Origin: https://github.com/vivkin/gason
5 
6  ---------------------------------------------------
7 
8  The MIT License (MIT)
9 
10  Copyright (c) 2013-2015 Ivan Vashchaev
11 
12  Permission is hereby granted, free of charge, to any person obtaining a copy of
13  this software and associated documentation files (the "Software"), to deal in
14  the Software without restriction, including without limitation the rights to
15  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
16  the Software, and to permit persons to whom the Software is furnished to do so,
17  subject to the following conditions:
18 
19  The above copyright notice and this permission notice shall be included in all
20  copies or substantial portions of the Software.
21 
22  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
24  FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
25  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
26  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
27  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 
29 */
30 
31 
32 #include <stdint.h>
33 #include <stddef.h>
34 #include <assert.h>
35 
36 namespace Gason // --OD added
37 { // --OD added
38 
39  enum JsonTag {
46  JSON_NULL = 0xF
47  };
48 
49  struct JsonNode;
50 
51 #define JSON_VALUE_PAYLOAD_MASK 0x00007FFFFFFFFFFFULL
52 #define JSON_VALUE_NAN_MASK 0x7FF8000000000000ULL
53 #define JSON_VALUE_TAG_MASK 0xF
54 #define JSON_VALUE_TAG_SHIFT 47
55 
56  union JsonValue {
57  uint64_t ival;
58  double fval;
59 
60  JsonValue(double x)
61  : fval(x) {
62  }
63  JsonValue(JsonTag tag = JSON_NULL, void *payload = nullptr) {
64  assert( (uintptr_t)payload <= JSON_VALUE_PAYLOAD_MASK );
65  ival = JSON_VALUE_NAN_MASK | ((uint64_t)tag << JSON_VALUE_TAG_SHIFT) | (uintptr_t)payload;
66  }
67  bool isDouble() const {
68  return (int64_t)ival <= (int64_t)JSON_VALUE_NAN_MASK;
69  }
70  JsonTag getTag() const {
72  }
73  uint64_t getPayload() const {
74  assert(!isDouble());
76  }
77  double toNumber() const {
78  assert(getTag() == JSON_NUMBER);
79  return fval;
80  }
81  char *toString() const {
82  assert( getTag() == JSON_STRING );
83  return (char *)getPayload();
84  }
85  JsonNode *toNode() const {
86  assert(getTag() == JSON_ARRAY || getTag() == JSON_OBJECT);
87  return (JsonNode *)getPayload();
88  }
89  };
90 
91  struct JsonNode {
94  char *key;
95  };
96 
97  struct JsonIterator {
99 
100  void operator++() {
101  p = p->next;
102  }
103  bool operator!=(const JsonIterator &x) const {
104  return p != x.p;
105  }
106  JsonNode *operator*() const {
107  return p;
108  }
109  JsonNode *operator->() const {
110  return p;
111  }
112  };
113 
115  return JsonIterator{ o.toNode() };
116  }
118  return JsonIterator{nullptr};
119  }
120 
121 #define JSON_ERRNO_MAP(XX) \
122  XX(OK, "ok") \
123  XX(BAD_NUMBER, "bad number") \
124  XX(BAD_STRING, "bad string") \
125  XX(BAD_IDENTIFIER, "bad identifier") \
126  XX(STACK_OVERFLOW, "stack overflow") \
127  XX(STACK_UNDERFLOW, "stack underflow") \
128  XX(MISMATCH_BRACKET, "mismatch bracket") \
129  XX(UNEXPECTED_CHARACTER, "unexpected character") \
130  XX(UNQUOTED_KEY, "unquoted key") \
131  XX(BREAKING_BAD, "breaking bad") \
132  XX(ALLOCATION_FAILURE, "allocation failure")
133 
134  enum JsonErrno {
135 #define XX(no, str) JSON_##no,
137 #undef XX
138  };
139 
140  const char *jsonStrError(int err);
141 
143  struct Zone {
145  size_t used;
146  } *head;
147 
148  public:
149  JsonAllocator() : head(nullptr) {};
150  JsonAllocator(const JsonAllocator &) = delete;
153  x.head = nullptr;
154  }
156  head = x.head;
157  x.head = nullptr;
158  return *this;
159  }
160  ~JsonAllocator() {
161  deallocate();
162  }
163  void *allocate(size_t size);
164  void deallocate();
165  };
166 
167  int jsonParse(char *str, char **endptr, JsonValue *value, JsonAllocator &allocator);
168 
169 } // --OD added
Gason::JsonAllocator
Definition: gason.h:141
Gason::JsonNode
Definition: gason.h:91
JSON_VALUE_PAYLOAD_MASK
#define JSON_VALUE_PAYLOAD_MASK
Definition: gason.h:51
Gason::JsonIterator::operator*
JsonNode * operator*() const
Definition: gason.h:106
Gason::JsonValue
Definition: gason.h:56
Gason::JsonAllocator::~JsonAllocator
~JsonAllocator()
Definition: gason.h:159
Gason::JsonAllocator::Zone
Definition: gason.h:142
Gason::JsonIterator::operator++
void operator++()
Definition: gason.h:100
Gason::JSON_FALSE
@ JSON_FALSE
Definition: gason.h:45
Gason::jsonParse
int jsonParse(char *str, char **endptr, JsonValue *value, JsonAllocator &allocator)
JSON_ERRNO_MAP
#define JSON_ERRNO_MAP(XX)
Definition: gason.h:121
Gason::JsonValue::isDouble
bool isDouble() const
Definition: gason.h:67
Gason::JsonAllocator::head
struct Gason::JsonAllocator::Zone * head
Gason::begin
JsonIterator begin(JsonValue o)
Definition: gason.h:114
XX
#define XX(no, str)
Definition: gason.h:135
Gason::JsonValue::getTag
JsonTag getTag() const
Definition: gason.h:70
JSON_VALUE_NAN_MASK
#define JSON_VALUE_NAN_MASK
Definition: gason.h:52
Gason::JsonNode::next
JsonNode * next
Definition: gason.h:93
Gason::JSON_ARRAY
@ JSON_ARRAY
Definition: gason.h:42
Gason::jsonStrError
const char * jsonStrError(int err)
Gason::JsonValue::JsonValue
JsonValue(JsonTag tag=JSON_NULL, void *payload=nullptr)
Definition: gason.h:63
Gason::JSON_NUMBER
@ JSON_NUMBER
Definition: gason.h:40
Gason::JsonIterator::operator!=
bool operator!=(const JsonIterator &x) const
Definition: gason.h:103
Gason::JsonAllocator::allocate
void * allocate(size_t size)
Gason::JsonValue::fval
double fval
Definition: gason.h:58
Gason::JSON_STRING
@ JSON_STRING
Definition: gason.h:41
Gason
Definition: odjson.h:22
Gason::JsonIterator
Definition: gason.h:97
Gason::JsonValue::ival
uint64_t ival
Definition: gason.h:57
Gason::end
JsonIterator end(JsonValue)
Definition: gason.h:117
Gason::JsonValue::toString
char * toString() const
Definition: gason.h:81
Gason::JsonAllocator::JsonAllocator
JsonAllocator()
Definition: gason.h:148
Gason::JSON_OBJECT
@ JSON_OBJECT
Definition: gason.h:43
Gason::JsonAllocator::Zone::next
Zone * next
Definition: gason.h:143
Gason::JsonIterator::operator->
JsonNode * operator->() const
Definition: gason.h:109
Gason::JsonValue::toNumber
double toNumber() const
Definition: gason.h:77
Gason::JsonIterator::p
JsonNode * p
Definition: gason.h:98
Gason::JSON_TRUE
@ JSON_TRUE
Definition: gason.h:44
Gason::JsonAllocator::Zone::used
size_t used
Definition: gason.h:144
JSON_VALUE_TAG_MASK
#define JSON_VALUE_TAG_MASK
Definition: gason.h:53
Gason::JsonAllocator::deallocate
void deallocate()
JSON_VALUE_TAG_SHIFT
#define JSON_VALUE_TAG_SHIFT
Definition: gason.h:54
Gason::JsonTag
JsonTag
Definition: gason.h:39
Gason::JsonErrno
JsonErrno
Definition: gason.h:134
Gason::JsonNode::key
char * key
Definition: gason.h:94
Gason::JsonAllocator::operator=
JsonAllocator & operator=(const JsonAllocator &)=delete
Gason::JSON_NULL
@ JSON_NULL
Definition: gason.h:46
Gason::JsonValue::JsonValue
JsonValue(double x)
Definition: gason.h:60
Gason::JsonNode::value
JsonValue value
Definition: gason.h:92
Gason::JsonAllocator::JsonAllocator
JsonAllocator(const JsonAllocator &)=delete
Gason::JsonValue::toNode
JsonNode * toNode() const
Definition: gason.h:85
Gason::JsonValue::getPayload
uint64_t getPayload() const
Definition: gason.h:73

Generated at for the OpendTect seismic interpretation project. Copyright (C): dGB Beheer B.V. 1995-2021