Qore Programming Language 2.0.0
Loading...
Searching...
No Matches
common.h
Go to the documentation of this file.
1/* -*- mode: c++; indent-tabs-mode: nil -*- */
2/*
3 common.h
4
5 Qore Programming Language
6
7 Copyright (C) 2003 - 2024 Qore Technologies, s.r.o.
8
9 Permission is hereby granted, free of charge, to any person obtaining a
10 copy of this software and associated documentation files (the "Software"),
11 to deal in the Software without restriction, including without limitation
12 the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 and/or sell copies of the Software, and to permit persons to whom the
14 Software is furnished to do so, subject to the following conditions:
15
16 The above copyright notice and this permission notice shall be included in
17 all copies or substantial portions of the Software.
18
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 DEALINGS IN THE SOFTWARE.
26
27 Note that the Qore library is released under a choice of three open-source
28 licenses: MIT (as above), LGPL 2+, or GPL 2+; see README-LICENSE for more
29 information.
30*/
31
32#ifndef _QORE_COMMON_H
33
34#define _QORE_COMMON_H
35
40#include <algorithm>
41#include <cinttypes>
42#include <cstdarg>
43#include <cstddef>
44#include <cstdlib>
45#include <cstring>
46#include <functional>
47#include <list>
48#include <set>
49#include <set>
50#include <string>
51#include <strings.h>
52#include <vector>
53
54#ifdef __GNUC__
55#define PACK __attribute__ ((packed))
56#else
57#define PACK
58#endif
59
61class QoreTypeInfo;
62
64#define Q_AF_UNSPEC -1
65
67#define Q_AF_INET -2
68
70#define Q_AF_INET6 -3
71
73#define Q_SOCK_STREAM -1
74
76typedef int16_t qore_type_t;
77
79typedef size_t qore_size_t;
80
82typedef intptr_t qore_offset_t;
83
85typedef unsigned qore_classid_t;
86
88typedef std::set<int> int_set_t;
89
92 QL_GPL = 0,
93 QL_LGPL = 1,
94 QL_MIT = 2
95};
96
97// class access values
98enum ClassAccess : unsigned char {
99 Public = 0, // publicly accessible
100 Private = 1, // accessible only in the class hierarchy (like c++'s 'protected')
101 Internal = 2, // accessible only in the class itself
102 Inaccessible = 3, // not accessible from the class
103};
104
105#if defined _MSC_VER || ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
106#define _Q_WINDOWS 1
107#ifdef _WIN64
108#define _Q_WINDOWS64 1
109#endif
110#endif
111
112#ifdef _Q_WINDOWS
113 #ifdef BUILDING_DLL
114 #define DLLEXPORT __declspec(dllexport)
115 #else
116 #define DLLEXPORT __declspec(dllimport)
117 #endif
118 #define DLLLOCAL
119
120 #define QLLD "%I64d"
121 #define QLLX "%I64x"
122 #define QLLDx(a) "%" #a "I64d"
123 #define QORE_DIR_SEP '\\'
124 #define QORE_DIR_SEP_STR "\\"
125 #define QORE_PATH_SEP ';'
126 #define QORE_PATH_SEP_STR ";"
127 #include <winsock2.h>
128#else
129 #ifdef HAVE_GCC_VISIBILITY
130 #define DLLEXPORT __attribute__ ((visibility("default")))
131 #define DLLLOCAL __attribute__ ((visibility("hidden")))
132 #else
133 #define DLLEXPORT
134 #define DLLLOCAL
135 #endif
136 #define QLLD "%lld"
137 #define QLLX "%llx"
138 #define QLLDx(a) "%" #a "lld"
139 #define QORE_DIR_SEP '/'
140 #define QORE_DIR_SEP_STR "/"
141 #define QORE_PATH_SEP ':'
142 #define QORE_PATH_SEP_STR ":"
143#endif
144
145#define _Q_MAKE_STRING(x) #x
146#define MAKE_STRING_FROM_SYMBOL(x) _Q_MAKE_STRING(x)
147
148// forward references
149class AbstractQoreNode;
150class QoreListNode;
151class ExceptionSink;
152class QoreObject;
154class QoreMethod;
155class QoreBuiltinMethod;
156class QoreClass;
157class TypedHashDecl;
158class QoreExternalFunction;
159class QoreExternalGlobalVar;
161class QoreNamespace;
162class QoreHashNode;
163
164hashdecl QoreValue;
165
166typedef std::vector<const QoreClass*> class_vec_t;
167typedef std::vector<std::pair<const TypedHashDecl*, const QoreNamespace*>> hashdecl_vec_t;
168typedef std::vector<const QoreExternalFunction*> func_vec_t;
169typedef std::vector<const QoreNamespace*> ns_vec_t;
170typedef std::vector<std::pair<const QoreExternalGlobalVar*, const QoreNamespace*>> gvar_vec_t;
171typedef std::vector<std::pair<const QoreExternalConstant*, const QoreNamespace*>> const_vec_t;
172
174template <typename T> hashdecl free_ptr {
175 DLLLOCAL void operator()(T* ptr) {
176 free(ptr);
177 }
178};
179
181template <typename T> hashdecl simple_delete {
182 DLLLOCAL void operator()(T* ptr) {
183 delete ptr;
184 }
185};
186
188template <typename T> hashdecl simple_deref {
189 DLLLOCAL void operator()(T* ptr) {
190 ptr->deref();
191 }
192 DLLLOCAL void operator()(T* ptr, ExceptionSink* xsink) {
193 ptr->deref(xsink);
194 }
195};
196
198class ltstr {
199public:
200 DLLLOCAL bool operator()(const char* s1, const char* s2) const {
201 return strcmp(s1, s2) < 0;
202 }
203};
204
207public:
208 DLLLOCAL bool operator()(const char* s1, const char* s2) const {
209 return strcasecmp(s1, s2) < 0;
210 }
211};
212
215public:
216 DLLLOCAL bool operator()(std::string s1, std::string s2) const {
217 return strcasecmp(s1.c_str(), s2.c_str()) < 0;
218 }
219};
220
221class eqstr {
222public:
223 DLLLOCAL bool operator()(const char* s1, const char* s2) const {
224 return !strcmp(s1, s2);
225 }
226};
227
228class eqstrcase {
229public:
230 DLLLOCAL bool operator()(const char* s1, const char* s2) const {
231 return !strcasecmp(s1, s2);
232 }
233};
234
236class ltchar {
237public:
238 DLLLOCAL bool operator()(const char s1, const char s2) const {
239 return s1 < s2;
240 }
241};
242
244class cstr_vector_t : public std::vector<char*> {
245public:
246 DLLLOCAL ~cstr_vector_t() {
247 clear();
248 }
249
250 DLLLOCAL void clear() {
251 std::for_each(begin(), end(), free_ptr<char>());
252 std::vector<char*>::clear();
253 }
254};
255
257typedef std::vector<const QoreTypeInfo*> type_vec_t;
258
260typedef std::vector<QoreValue> arg_vec_t;
261
263typedef std::vector<std::string> name_vec_t;
264
266typedef long long int64;
267
269typedef uint64_t q_rt_flags_t;
270
272constexpr size_t QSF_INCLUDE_STATIC_CLASS_VARS = (1 << 0);
273
275constexpr size_t QDF_STATIC_CLASS_VARS = (1 << 0);
276
279
281
284public:
286
291 DLLEXPORT int serializeObject(const QoreObject& obj, std::string& index, ExceptionSink* xsink);
292
294
299 DLLEXPORT int serializeHash(const QoreHashNode& h, std::string& index, ExceptionSink* xsink);
300
302
307 DLLEXPORT int serializeList(const QoreListNode& l, std::string& index, ExceptionSink* xsink);
308
310
312 DLLEXPORT QoreValue serializeValue(const QoreValue val, ExceptionSink* xsink);
313
315 DLLEXPORT void addModule(const char* module);
316
318 DLLEXPORT int64 getFlags() const;
319
320private:
322 DLLLOCAL QoreSerializationContext();
323};
324
326
329public:
331
333 DLLEXPORT QoreValue deserializeContainer(const char* index, ExceptionSink* xsink);
334
336
338 DLLEXPORT QoreValue deserializeValue(const QoreValue val, ExceptionSink* xsink);
339
341 DLLEXPORT int64 getFlags() const;
342
343private:
346};
347
349
355typedef QoreValue (*q_func_n_t)(const QoreListNode* args, q_rt_flags_t flags, ExceptionSink* xsink);
356
358
367typedef QoreValue (*q_external_func_t)(const void* ptr, const QoreListNode* args, q_rt_flags_t flags, ExceptionSink* xsink);
368
370
378typedef QoreValue (*q_method_n_t)(QoreObject* self, AbstractPrivateData* private_data, const QoreListNode* args, q_rt_flags_t flags, ExceptionSink* xsink);
379
381
393typedef QoreValue (*q_external_method_t)(const QoreMethod& method, const void* ptr, QoreObject* self, AbstractPrivateData* private_data, const QoreListNode* args, q_rt_flags_t flags, ExceptionSink* xsink);
394
396
406typedef QoreValue (*q_external_static_method_t)(const QoreMethod& method, const void* ptr, const QoreListNode* args, q_rt_flags_t flags, ExceptionSink* xsink);
407
409
414typedef void (*q_constructor_n_t)(QoreObject* self, const QoreListNode* args, q_rt_flags_t rtflags, ExceptionSink* xsink);
415
417
426typedef void (*q_external_constructor_t)(const QoreMethod& method, const void* ptr, QoreObject* self, const QoreListNode* args, q_rt_flags_t rtflags, ExceptionSink* xsink);
427
429
438typedef void (*q_system_constructor_t)(QoreObject* self, int code, va_list args);
439
441
446typedef void (*q_destructor_t)(QoreObject* self, AbstractPrivateData* private_data, ExceptionSink* xsink);
447
449
456typedef void (*q_external_destructor_t)(const QoreClass& thisclass, const void* ptr, QoreObject* self, AbstractPrivateData* private_data, ExceptionSink* xsink);
457
459
465typedef void (*q_copy_t)(QoreObject* self, QoreObject* old, AbstractPrivateData* private_data, ExceptionSink* xsink);
466
468
476typedef void (*q_external_copy_t)(const QoreClass& thisclass, const void* ptr, QoreObject* self, QoreObject* old, AbstractPrivateData* private_data, ExceptionSink* xsink);
477
479
486typedef QoreHashNode* (*q_serializer_t)(const QoreObject& self, const AbstractPrivateData& data, QoreSerializationContext& context, ExceptionSink* xsink);
487
489
498typedef void (*q_deserializer_t)(QoreObject& self, const QoreHashNode* sdata, QoreDeserializationContext& context, ExceptionSink* xsink);
499
501
503typedef unsigned q_trid_t;
504
506DLLEXPORT long long q_atoll(const char* str);
507
509
511DLLEXPORT const char* type_get_name(const QoreTypeInfo* t);
512
513#endif // _QORE_COMMON_H
the base class for all data to be used as private data of Qore objects
Definition AbstractPrivateData.h:44
The base class for all value and parse types in Qore expression trees.
Definition AbstractQoreNode.h:57
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition ExceptionSink.h:50
defines a Qore-language class
Definition QoreClass.h:310
deserialization context object used in builtin deserializer methods
Definition common.h:328
DLLEXPORT QoreValue deserializeContainer(const char *index, ExceptionSink *xsink)
returns the container corresponding to the given serialization index
DLLEXPORT QoreValue deserializeValue(const QoreValue val, ExceptionSink *xsink)
deserializes the given data value and returns the deserialized value
DLLEXPORT int64 getFlags() const
Returns the current deserialization flag bitfield.
external wrapper class for constants
Definition QoreReflection.h:200
This is the hash or associative list container type in Qore, dynamically allocated only,...
Definition QoreHashNode.h:51
This is the list container type in Qore, dynamically allocated only, reference counted.
Definition QoreListNode.h:52
a method in a QoreClass
Definition QoreClass.h:143
contains constants, classes, and subnamespaces in QoreProgram objects
Definition QoreNamespace.h:65
the implementation of Qore's object data type, reference counted, dynamically-allocated only
Definition QoreObject.h:61
serialization context object used in builtin serializer methods
Definition common.h:283
DLLEXPORT int serializeHash(const QoreHashNode &h, std::string &index, ExceptionSink *xsink)
Serializes the given hash and returns the serialization index.
DLLEXPORT int serializeObject(const QoreObject &obj, std::string &index, ExceptionSink *xsink)
Serializes the given object and returns the serialization index.
DLLEXPORT int64 getFlags() const
Returns the current serialization flag bitfield.
DLLEXPORT void addModule(const char *module)
Adds a module to be loaded when the data is deserialized.
DLLEXPORT int serializeList(const QoreListNode &l, std::string &index, ExceptionSink *xsink)
Serializes the given list and returns the serialization index.
DLLEXPORT QoreValue serializeValue(const QoreValue val, ExceptionSink *xsink)
Serializes the given value and returns a serialized value representing the value to be serialized.
typed hash declaration
Definition TypedHashDecl.h:44
non-thread-safe vector for storing "char*" that you want to delete
Definition common.h:244
for char less-than comparisons
Definition common.h:236
for simple c-string case-insensitive less-than comparisons
Definition common.h:206
for simple c-string less-than comparisons
Definition common.h:198
for std::string case-insensitive less-than comparisons
Definition common.h:214
QoreValue(* q_external_method_t)(const QoreMethod &method, const void *ptr, QoreObject *self, AbstractPrivateData *private_data, const QoreListNode *args, q_rt_flags_t flags, ExceptionSink *xsink)
the type used for builtin QoreClass method signatures
Definition common.h:393
constexpr size_t QSF_INCLUDE_STATIC_CLASS_VARS
Serialization flag; include static class vars.
Definition common.h:272
void(* q_external_destructor_t)(const QoreClass &thisclass, const void *ptr, QoreObject *self, AbstractPrivateData *private_data, ExceptionSink *xsink)
the type used for builtin QoreClass destructor signatures with the new generic calling convention and...
Definition common.h:456
int16_t qore_type_t
used to identify unique Qore data and parse types (descendents of AbstractQoreNode)
Definition common.h:76
DLLEXPORT const char * type_get_name(const QoreTypeInfo *t)
returns the type name for an opaqua QoreTypeInfo ptr
uint64_t q_rt_flags_t
runtime code execution flags
Definition common.h:269
DLLEXPORT long long q_atoll(const char *str)
returns an integer value for a string
QoreValue(* q_external_static_method_t)(const QoreMethod &method, const void *ptr, const QoreListNode *args, q_rt_flags_t flags, ExceptionSink *xsink)
the type used for external static methods
Definition common.h:406
QoreValue(* q_func_n_t)(const QoreListNode *args, q_rt_flags_t flags, ExceptionSink *xsink)
the type used for builtin function signatures
Definition common.h:355
void(* q_copy_t)(QoreObject *self, QoreObject *old, AbstractPrivateData *private_data, ExceptionSink *xsink)
the type used for builtin QoreClass copy signatures
Definition common.h:465
constexpr size_t QDF_STATIC_CLASS_VARS
Deserialization flag: deserialize static class vars.
Definition common.h:275
void(* q_system_constructor_t)(QoreObject *self, int code, va_list args)
the type used for builtin QoreClass system constructor method signatures
Definition common.h:438
QoreValue(* q_method_n_t)(QoreObject *self, AbstractPrivateData *private_data, const QoreListNode *args, q_rt_flags_t flags, ExceptionSink *xsink)
the type used for builtin QoreClass method signatures
Definition common.h:378
std::set< int > int_set_t
set of integers
Definition common.h:88
void(* q_external_constructor_t)(const QoreMethod &method, const void *ptr, QoreObject *self, const QoreListNode *args, q_rt_flags_t rtflags, ExceptionSink *xsink)
the type used for builtin QoreClass constructor method signatures
Definition common.h:426
std::vector< const QoreTypeInfo * > type_vec_t
vector of type information for parameter lists
Definition common.h:257
unsigned q_trid_t
type for thread resource IDs (unique within a single running qore library process)
Definition common.h:503
qore_license_t
qore library and module license type identifiers
Definition common.h:91
@ QL_GPL
code to be used under the GPL license
Definition common.h:92
@ QL_LGPL
code to be used under the LGPL license
Definition common.h:93
@ QL_MIT
code to be used under the MIT license
Definition common.h:94
void(* q_destructor_t)(QoreObject *self, AbstractPrivateData *private_data, ExceptionSink *xsink)
the type used for builtin QoreClass destructor signatures
Definition common.h:446
void(* q_external_copy_t)(const QoreClass &thisclass, const void *ptr, QoreObject *self, QoreObject *old, AbstractPrivateData *private_data, ExceptionSink *xsink)
the type used for builtin QoreClass copy signatures with the new generic calling convention
Definition common.h:476
unsigned qore_classid_t
used for the unique class ID for QoreClass objects
Definition common.h:85
std::vector< std::string > name_vec_t
vector of parameter names for parameter lists
Definition common.h:263
void(* q_deserializer_t)(QoreObject &self, const QoreHashNode *sdata, QoreDeserializationContext &context, ExceptionSink *xsink)
the type used for builtin QoreClass deserializer method signatures
Definition common.h:498
intptr_t qore_offset_t
used for offsets that could be negative
Definition common.h:82
size_t qore_size_t
used for sizes (same range as a pointer)
Definition common.h:79
long long int64
64bit integer type, cannot use int64_t here since it breaks the API on some 64-bit systems due to equ...
Definition common.h:266
QoreValue(* q_external_func_t)(const void *ptr, const QoreListNode *args, q_rt_flags_t flags, ExceptionSink *xsink)
the type used for builtin function signatures for external functions
Definition common.h:367
void(* q_constructor_n_t)(QoreObject *self, const QoreListNode *args, q_rt_flags_t rtflags, ExceptionSink *xsink)
the type used for builtin QoreClass constructor method signatures
Definition common.h:414
std::vector< QoreValue > arg_vec_t
vector of value information for default argument lists
Definition common.h:260
constexpr size_t QDF_MERGE_STATIC_CLASS_VARS
Deserialization flag: deserialize and merge static class vars; implies QDF_STATIC_CLASS_VARS.
Definition common.h:278
The main value class in Qore, designed to be passed by value.
Definition QoreValue.h:279
functor template for calling free() on pointers
Definition common.h:174
functor template for deleting elements
Definition common.h:181
functor template for dereferencing elements
Definition common.h:188