Qore Programming Language 1.17.0
Loading...
Searching...
No Matches
QoreNamespace.h
1/* -*- mode: c++; indent-tabs-mode: nil -*- */
2/*
3 QoreNamespace.h
4
5 Qore Programming Language
6
7 Copyright (C) 2003 - 2023 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/*
33 namespaces are children of a program object. there is a parse
34 lock per program object to ensure that objects are added (or backed out)
35 atomically per program object. All the objects referenced here should
36 be safe to read & copied at all times. They will only be deleted when the
37 program object is deleted (except the pending structures, which will be
38 deleted any time there is a parse error, together with all other
39 pending structures)
40*/
41
42#ifndef _QORE_QORENAMESPACE_H
43
44#define _QORE_QORENAMESPACE_H
45
46#include <cstdlib>
47#include <cstring>
48#include <string>
49
50// forward declarations
51class QoreExternalFunction;
53class QoreExternalGlobalVar;
54class QoreProgram;
55
57
62typedef QoreClass* (*q_ns_class_handler_t)(QoreNamespace* ns, const char* cname);
63
66 friend class QoreNamespaceList;
67 friend class RootQoreNamespace;
68 friend class qore_ns_private;
69 friend class qore_root_ns_private;
70 friend hashdecl NSOInfoBase;
71
72public:
74
77 DLLEXPORT QoreNamespace(const char* n);
78
80
85 DLLEXPORT QoreNamespace(const QoreNamespace& old, int64 po);
86
88 DLLEXPORT virtual ~QoreNamespace();
89
91
95 DLLEXPORT void clear(ExceptionSink* xsink);
96
98
104 DLLEXPORT void addConstant(const char* name, QoreValue value);
105
107
113 DLLEXPORT void addConstant(const char* name, QoreValue value, const QoreTypeInfo* typeInfo);
114
116
119 DLLEXPORT void addSystemClass(QoreClass* oc);
120
122
127 DLLEXPORT void addSystemHashDecl(TypedHashDecl* hashdecl);
128
130
133 DLLEXPORT QoreNamespace* copy(int64 po = PO_DEFAULT) const;
134
136
141 DLLEXPORT QoreHashNode* getClassInfo() const;
142
144
149 DLLEXPORT QoreHashNode* getConstantInfo() const;
150
152
158 DLLEXPORT QoreHashNode* getInfo() const;
159
161
164 DLLEXPORT const char* getName() const;
165
167
170 DLLEXPORT void addNamespace(QoreNamespace* ns);
171
173
179
181
193 DLLEXPORT QoreNamespace* findCreateNamespacePath(const char* nspath);
194
196
208 DLLEXPORT QoreNamespace* findCreateNamespacePathAll(const char* nspath);
209
211
217 DLLEXPORT QoreClass* findLocalClass(const char* cname) const;
218
220
228 DLLEXPORT QoreClass* findLoadLocalClass(const char* cname);
229
231
235 DLLEXPORT QoreNamespace* findLocalNamespace(const char* nsname) const;
236
238
241 DLLEXPORT void setClassHandler(q_ns_class_handler_t class_handler);
242
244
246 DLLEXPORT const QoreNamespace* getParent() const;
247
249 DLLEXPORT void deleteData(ExceptionSink* xsink);
250
252 DLLEXPORT void addBuiltinVariant(const char* name, q_func_n_t f, int64 code_flags = QCF_NO_FLAGS, int64 functional_domain = QDOM_DEFAULT, const QoreTypeInfo* returnTypeInfo = 0, unsigned num_params = 0, ...);
253
255
257 DLLEXPORT void addBuiltinVariant(void* ptr, const char* name, q_external_func_t f,
258 int64 code_flags = QCF_NO_FLAGS, int64 functional_domain = QDOM_DEFAULT,
259 const QoreTypeInfo* returnTypeInfo = nullptr, unsigned num_params = 0, ...);
260
262
264 DLLEXPORT const QoreExternalFunction* findLocalFunction(const char* name) const;
265
267
269 DLLEXPORT const QoreExternalConstant* findLocalConstant(const char* name) const;
270
272
274 DLLEXPORT const QoreExternalGlobalVar* findLocalGlobalVar(const char* name) const;
275
277
279 DLLEXPORT const TypedHashDecl* findLocalTypedHash(const char* name) const;
280
282
286 DLLEXPORT std::string getPath(bool anchored = false) const;
287
289
291 DLLEXPORT bool isModulePublic() const;
292
294
296 DLLEXPORT bool isBuiltin() const;
297
299
301 DLLEXPORT bool isImported() const;
302
304
306 DLLEXPORT bool isRoot() const;
307
309
311 DLLEXPORT QoreProgram* getProgram() const;
312
314
316 DLLEXPORT const char* getModuleName() const;
317
319
328 DLLEXPORT QoreValue setKeyValue(const std::string& key, QoreValue val);
329
331
342 DLLEXPORT QoreValue setKeyValueIfNotSet(const std::string& key, QoreValue val);
343
345
354 DLLEXPORT bool setKeyValueIfNotSet(const std::string& key, const char* str);
355
357
365 DLLEXPORT QoreValue getReferencedKeyValue(const std::string& key) const;
366
368
376 DLLEXPORT QoreValue getReferencedKeyValue(const char* key) const;
377
378private:
380 QoreNamespace(const QoreNamespace&) = delete;
381
383 QoreNamespace& operator=(const QoreNamespace&) = delete;
384
385protected:
386 class qore_ns_private* priv; // private implementation
387
388 // protected, function not exported in the API
389 DLLLOCAL QoreNamespace(qore_ns_private* p);
390};
391
393
398 friend class qore_ns_private;
399 friend class qore_root_ns_private;
400 friend class StaticSystemNamespace;
401
402public:
404
408
410 DLLLOCAL virtual ~RootQoreNamespace();
411
413
415 DLLEXPORT QoreProgram* getProgram() const;
416
417protected:
418 // private implementation
419 class qore_root_ns_private* rpriv;
420
421private:
423 RootQoreNamespace(const RootQoreNamespace&) = delete;
424
426 RootQoreNamespace& operator=(const RootQoreNamespace&) = delete;
427
428 DLLLOCAL RootQoreNamespace(class qore_root_ns_private* p);
429};
430
431class QorePrivateNamespaceIterator;
432
434
437public:
440
442 DLLEXPORT virtual ~QoreNamespaceIterator();
443
445 DLLEXPORT bool next();
446
449
452
454 DLLEXPORT QoreNamespace& get();
455
457 DLLEXPORT const QoreNamespace* operator->() const;
459 DLLEXPORT const QoreNamespace* operator*() const;
460
462 DLLEXPORT const QoreNamespace& get() const;
463
464private:
467
469 QoreNamespaceIterator& operator=(const QoreNamespaceIterator&) = delete;
470
471 QorePrivateNamespaceIterator* priv;
472};
473
475
478public:
481
483 DLLEXPORT virtual ~QoreNamespaceConstIterator();
484
486 DLLEXPORT bool next();
487
489 DLLEXPORT const QoreNamespace* operator->() const;
490
492 DLLEXPORT const QoreNamespace* operator*() const;
493
495 DLLEXPORT const QoreNamespace& get() const;
496
497private:
500
502 QoreNamespaceConstIterator& operator=(const QoreNamespaceConstIterator&) = delete;
503
504 QorePrivateNamespaceIterator* priv;
505};
506
508
511public:
514
517
519 DLLEXPORT bool next();
520
522 DLLEXPORT const QoreNamespace& get() const;
523
524private:
527
530
531 class qore_namespace_namespace_iterator* priv;
532};
533
535
538public:
541
544
546 DLLEXPORT bool next();
547
549 DLLEXPORT const QoreExternalFunction& get() const;
550
551private:
554
557
558 class qore_namespace_function_iterator* priv;
559};
560
562
565public:
568
571
573 DLLEXPORT bool next();
574
576 DLLEXPORT const QoreExternalConstant& get() const;
577
578private:
581
584
585 class qore_namespace_constant_iterator* priv;
586};
587
589
592public:
595
597 DLLEXPORT virtual ~QoreNamespaceClassIterator();
598
600 DLLEXPORT bool next();
601
603 DLLEXPORT const QoreClass& get() const;
604
605private:
608
610 QoreNamespaceClassIterator& operator=(const QoreNamespaceClassIterator&) = delete;
611
612 class ConstClassListIterator* priv;
613};
614
616
619public:
622
625
627 DLLEXPORT bool next();
628
630 DLLEXPORT const QoreExternalGlobalVar& get() const;
631
632private:
635
638
639 class qore_namespace_globalvar_iterator* priv;
640};
641
643
646public:
649
652
654 DLLEXPORT bool next();
655
657 DLLEXPORT const TypedHashDecl& get() const;
658
659private:
662
665
666 class ConstHashDeclListIterator* priv;
667};
668
669#endif // QORE_NAMESPACE_H
#define QDOM_DEFAULT
the default domain (no domain)
Definition: Restrictions.h:170
#define PO_DEFAULT
no parse options set by default
Definition: Restrictions.h:108
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:249
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:50
allows classes in a namespace to be iterated
Definition: QoreNamespace.h:591
virtual DLLEXPORT ~QoreNamespaceClassIterator()
destroys the object
DLLEXPORT bool next()
moves to the next position; returns true if on a valid position
DLLEXPORT QoreNamespaceClassIterator(const QoreNamespace &ns)
creates the iterator
DLLEXPORT const QoreClass & get() const
returns the class
allows all namespaces of a namespace to be iterated (including the namespace passed in the constructo...
Definition: QoreNamespace.h:477
virtual DLLEXPORT ~QoreNamespaceConstIterator()
destroys the object
DLLEXPORT const QoreNamespace & get() const
returns the namespace
DLLEXPORT QoreNamespaceConstIterator(const QoreNamespace &ns)
creates the iterator; the namespace given will also be included in the iteration set
DLLEXPORT const QoreNamespace * operator->() const
returns the namespace
DLLEXPORT const QoreNamespace * operator*() const
returns the namespace
DLLEXPORT bool next()
moves to the next position; returns true if on a valid position
allows constants in a namespace to be iterated
Definition: QoreNamespace.h:564
DLLEXPORT bool next()
moves to the next position; returns true if on a valid position
DLLEXPORT const QoreExternalConstant & get() const
returns the constant
virtual DLLEXPORT ~QoreNamespaceConstantIterator()
destroys the object
DLLEXPORT QoreNamespaceConstantIterator(const QoreNamespace &ns)
creates the iterator
allows functions in a namespace to be iterated
Definition: QoreNamespace.h:537
DLLEXPORT bool next()
moves to the next position; returns true if on a valid position
DLLEXPORT const QoreExternalFunction & get() const
returns the function
DLLEXPORT QoreNamespaceFunctionIterator(const QoreNamespace &ns)
creates the iterator
virtual DLLEXPORT ~QoreNamespaceFunctionIterator()
destroys the object
allows global variables in a namespace to be iterated
Definition: QoreNamespace.h:618
DLLEXPORT const QoreExternalGlobalVar & get() const
returns the global variable
DLLEXPORT QoreNamespaceGlobalVarIterator(const QoreNamespace &ns)
creates the iterator
virtual DLLEXPORT ~QoreNamespaceGlobalVarIterator()
destroys the object
DLLEXPORT bool next()
moves to the next position; returns true if on a valid position
contains constants, classes, and subnamespaces in QoreProgram objects
Definition: QoreNamespace.h:65
DLLEXPORT void addNamespace(QoreNamespace *ns)
adds a namespace to the namespace tree
DLLEXPORT QoreNamespace(const QoreNamespace &old, int64 po)
copies the namespace and assigns new parse options to the new namespace
DLLEXPORT bool isRoot() const
returns true if the namespace is the root namespace
DLLEXPORT void addSystemClass(QoreClass *oc)
adds a class to a namespace
DLLEXPORT QoreNamespace * copy(int64 po=PO_DEFAULT) const
returns a deep copy of the namespace
DLLEXPORT QoreValue setKeyValue(const std::string &key, QoreValue val)
Sets a key value in the namespace's key-value store unconditionally.
DLLEXPORT void addConstant(const char *name, QoreValue value, const QoreTypeInfo *typeInfo)
adds a constant definition to the namespace with type information
DLLEXPORT bool isBuiltin() const
returns true if the namespace is builtin
DLLEXPORT void addBuiltinVariant(const char *name, q_func_n_t f, int64 code_flags=QCF_NO_FLAGS, int64 functional_domain=QDOM_DEFAULT, const QoreTypeInfo *returnTypeInfo=0, unsigned num_params=0,...)
adds a function variant
DLLEXPORT void deleteData(ExceptionSink *xsink)
this function must be called before the QoreNamespace object is deleted or a crash could result due i...
DLLEXPORT bool setKeyValueIfNotSet(const std::string &key, const char *str)
Sets a key value in the namespace's key-value store only if no value exists for the given key.
DLLEXPORT void addConstant(const char *name, QoreValue value)
adds a constant definition to the namespace
DLLEXPORT QoreNamespace * findCreateNamespacePathAll(const char *nspath)
finds a Namespace based on the argument; creates it (or the whole path) if necessary
DLLEXPORT std::string getPath(bool anchored=false) const
returns the path for the namespace
DLLEXPORT QoreValue getReferencedKeyValue(const std::string &key) const
Returns a referenced key value from the namespace's key-value store.
DLLEXPORT void addBuiltinVariant(void *ptr, const char *name, q_external_func_t f, int64 code_flags=QCF_NO_FLAGS, int64 functional_domain=QDOM_DEFAULT, const QoreTypeInfo *returnTypeInfo=nullptr, unsigned num_params=0,...)
adds a function variant
DLLEXPORT const QoreExternalFunction * findLocalFunction(const char *name) const
find a function in the current namespace; returns nullptr if not found
DLLEXPORT QoreHashNode * getInfo() const
returns a hash giving information about the definitions in the namespace
DLLEXPORT void addSystemHashDecl(TypedHashDecl *hashdecl)
adds a hashdecl to a namespace
DLLEXPORT void setClassHandler(q_ns_class_handler_t class_handler)
sets the namespace class handler
DLLEXPORT QoreValue setKeyValueIfNotSet(const std::string &key, QoreValue val)
Sets a key value in the namespace's key-value store only if no value exists for the given key.
DLLEXPORT QoreClass * findLoadLocalClass(const char *cname)
finds a class in this namespace, does not search child namespaces
DLLEXPORT QoreClass * findLocalClass(const char *cname) const
finds a class in this namespace, does not search child namespaces
DLLEXPORT const QoreExternalGlobalVar * findLocalGlobalVar(const char *name) const
find a global variable in the current namespace; returns nullptr if not found
DLLEXPORT QoreNamespace(const char *n)
creates a namespace with the given name
DLLEXPORT void clear(ExceptionSink *xsink)
clears the contents of the namespace before deleting
DLLEXPORT QoreProgram * getProgram() const
Returns the owning QoreProgram object (if not the static system namespace)
DLLEXPORT QoreValue getReferencedKeyValue(const char *key) const
Returns a referenced key value from the namespace's key-value store.
DLLEXPORT const char * getModuleName() const
Returns the module name the namespace was loaded from or nullptr if it is a builtin namespace.
virtual DLLEXPORT ~QoreNamespace()
destroys the object and frees memory
DLLEXPORT void addInitialNamespace(QoreNamespace *ns)
adds a subnamespace to the namespace
DLLEXPORT const QoreNamespace * getParent() const
returns a pointer to the parent namespace or nullptr if there is no parent
DLLEXPORT const char * getName() const
returns the name of the namespace
DLLEXPORT QoreHashNode * getClassInfo() const
gets a hash of all classes in the namespace, the hash keys are the class names and the values are lis...
DLLEXPORT const TypedHashDecl * findLocalTypedHash(const char *name) const
find a typed hash (hashdecl) in the current namespace; returns nullptr if not found
DLLEXPORT QoreNamespace * findLocalNamespace(const char *nsname) const
finds a subnamespace in this namespace, does not search child namespaces
DLLEXPORT bool isModulePublic() const
returns true if the namespace has its module public flag set
DLLEXPORT const QoreExternalConstant * findLocalConstant(const char *name) const
find a constant in the current namespace; returns nullptr if not found
DLLEXPORT QoreHashNode * getConstantInfo() const
a hash of all constants in the namespace, the hash keys are the constant names and the values are the...
DLLEXPORT bool isImported() const
returns true if the namespace was imported from another program object
DLLEXPORT QoreNamespace * findCreateNamespacePath(const char *nspath)
finds a Namespace based on the argument; creates it (or the whole path) if necessary
allows all namespaces of a namespace to be iterated (including the namespace passed in the constructo...
Definition: QoreNamespace.h:436
DLLEXPORT const QoreNamespace * operator->() const
returns the namespace
DLLEXPORT const QoreNamespace * operator*() const
returns the namespace
DLLEXPORT bool next()
moves to the next position; returns true if on a valid position
DLLEXPORT QoreNamespace * operator->()
returns the namespace
DLLEXPORT QoreNamespace * operator*()
returns the namespace
DLLEXPORT QoreNamespace & get()
returns the namespace
DLLEXPORT const QoreNamespace & get() const
returns the namespace
virtual DLLEXPORT ~QoreNamespaceIterator()
destroys the object
DLLEXPORT QoreNamespaceIterator(QoreNamespace &ns)
creates the iterator; the namespace given will also be included in the iteration set
allows local namespaces to be iterated
Definition: QoreNamespace.h:510
virtual DLLEXPORT ~QoreNamespaceNamespaceIterator()
destroys the object
DLLEXPORT bool next()
moves to the next position; returns true if on a valid position
DLLEXPORT QoreNamespaceNamespaceIterator(const QoreNamespace &ns)
creates the iterator
DLLEXPORT const QoreNamespace & get() const
returns the namespace
allows typed hashes (hashdecls) in a namespace to be iterated
Definition: QoreNamespace.h:645
DLLEXPORT const TypedHashDecl & get() const
returns the typed hash (hashdecl)
virtual DLLEXPORT ~QoreNamespaceTypedHashIterator()
destroys the object
DLLEXPORT QoreNamespaceTypedHashIterator(const QoreNamespace &ns)
creates the iterator
DLLEXPORT bool next()
moves to the next position; returns true if on a valid position
supports parsing and executing Qore-language code, reference counted, dynamically-allocated only
Definition: QoreProgram.h:128
the root namespace of a QoreProgram object
Definition: QoreNamespace.h:397
DLLEXPORT QoreProgram * getProgram() const
Returns the owning QoreProgram object (if not the static system namespace)
DLLEXPORT QoreNamespace * rootGetQoreNamespace() const
returns a pointer to the QoreNamespace for the "Qore" namespace
virtual DLLLOCAL ~RootQoreNamespace()
destructor is not exported in the library's public API
typed hash declaration
Definition: TypedHashDecl.h:44
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:307
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:260
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:319
static unsigned num_params(const QoreListNode *n)
returns the number of arguments passed to the function
Definition: params.h:54
The main value class in Qore, designed to be passed by value.
Definition: QoreValue.h:276