Qore Programming Language  1.9.0
QoreNamespace.h
1 /* -*- mode: c++; indent-tabs-mode: nil -*- */
2 /*
3  QoreNamespace.h
4 
5  Qore Programming Language
6 
7  Copyright (C) 2003 - 2022 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
51 class QoreExternalFunction;
53 class QoreExternalGlobalVar;
54 class QoreProgram;
55 
57 
62 typedef 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 
72 public:
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 
178  DLLEXPORT void addInitialNamespace(QoreNamespace* ns);
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 
378 private:
380  QoreNamespace(const QoreNamespace&) = delete;
381 
383  QoreNamespace& operator=(const QoreNamespace&) = delete;
384 
385 protected:
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 
402 public:
404 
408 
410  DLLLOCAL virtual ~RootQoreNamespace();
411 
413 
415  DLLEXPORT QoreProgram* getProgram() const;
416 
417 protected:
418  // private implementation
419  class qore_root_ns_private* rpriv;
420 
421 private:
423  RootQoreNamespace(const RootQoreNamespace&) = delete;
424 
426  RootQoreNamespace& operator=(const RootQoreNamespace&) = delete;
427 
428  DLLLOCAL RootQoreNamespace(class qore_root_ns_private* p);
429 };
430 
431 class QorePrivateNamespaceIterator;
432 
434 
437 public:
440 
442  DLLEXPORT virtual ~QoreNamespaceIterator();
443 
445  DLLEXPORT bool next();
446 
448  DLLEXPORT QoreNamespace* operator->();
449 
451  DLLEXPORT QoreNamespace* operator*();
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 
464 private:
467 
469  QoreNamespaceIterator& operator=(const QoreNamespaceIterator&) = delete;
470 
471  QorePrivateNamespaceIterator* priv;
472 };
473 
475 
478 public:
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 
497 private:
500 
502  QoreNamespaceConstIterator& operator=(const QoreNamespaceConstIterator&) = delete;
503 
504  QorePrivateNamespaceIterator* priv;
505 };
506 
508 
511 public:
514 
516  DLLEXPORT virtual ~QoreNamespaceNamespaceIterator();
517 
519  DLLEXPORT bool next();
520 
522  DLLEXPORT const QoreNamespace& get() const;
523 
524 private:
527 
530 
531  class qore_namespace_namespace_iterator* priv;
532 };
533 
535 
538 public:
541 
543  DLLEXPORT virtual ~QoreNamespaceFunctionIterator();
544 
546  DLLEXPORT bool next();
547 
549  DLLEXPORT const QoreExternalFunction& get() const;
550 
551 private:
554 
557 
558  class qore_namespace_function_iterator* priv;
559 };
560 
562 
565 public:
568 
570  DLLEXPORT virtual ~QoreNamespaceConstantIterator();
571 
573  DLLEXPORT bool next();
574 
576  DLLEXPORT const QoreExternalConstant& get() const;
577 
578 private:
581 
584 
585  class qore_namespace_constant_iterator* priv;
586 };
587 
589 
592 public:
595 
597  DLLEXPORT virtual ~QoreNamespaceClassIterator();
598 
600  DLLEXPORT bool next();
601 
603  DLLEXPORT const QoreClass& get() const;
604 
605 private:
608 
610  QoreNamespaceClassIterator& operator=(const QoreNamespaceClassIterator&) = delete;
611 
612  class ConstClassListIterator* priv;
613 };
614 
616 
619 public:
622 
624  DLLEXPORT virtual ~QoreNamespaceGlobalVarIterator();
625 
627  DLLEXPORT bool next();
628 
630  DLLEXPORT const QoreExternalGlobalVar& get() const;
631 
632 private:
635 
638 
639  class qore_namespace_globalvar_iterator* priv;
640 };
641 
643 
646 public:
649 
651  DLLEXPORT virtual ~QoreNamespaceTypedHashIterator();
652 
654  DLLEXPORT bool next();
655 
657  DLLEXPORT const TypedHashDecl& get() const;
658 
659 private:
662 
665 
666  class ConstHashDeclListIterator* priv;
667 };
668 
669 #endif // QORE_NAMESPACE_H
#define QDOM_DEFAULT
the default domain (no domain)
Definition: Restrictions.h:159
#define PO_DEFAULT
no parse options set by default
Definition: Restrictions.h:107
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition: ExceptionSink.h:48
defines a Qore-language class
Definition: QoreClass.h:239
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 const QoreClass & get() const
returns the class
DLLEXPORT bool next()
moves to the next position; returns true if on a valid position
DLLEXPORT QoreNamespaceClassIterator(const QoreNamespace &ns)
creates the iterator
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 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 const QoreNamespace & get() 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
virtual DLLEXPORT ~QoreNamespaceConstantIterator()
destroys the object
DLLEXPORT QoreNamespaceConstantIterator(const QoreNamespace &ns)
creates the iterator
DLLEXPORT const QoreExternalConstant & get() const
returns the constant
allows functions in a namespace to be iterated
Definition: QoreNamespace.h:537
DLLEXPORT const QoreExternalFunction & get() const
returns the function
DLLEXPORT bool next()
moves to the next position; returns true if on a valid position
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 QoreNamespaceGlobalVarIterator(const QoreNamespace &ns)
creates the iterator
DLLEXPORT const QoreExternalGlobalVar & get() const
returns the global variable
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 QoreNamespace * copy(int64 po=PO_DEFAULT) const
returns a deep copy of the namespace
DLLEXPORT void addNamespace(QoreNamespace *ns)
adds a namespace to the namespace tree
DLLEXPORT QoreNamespace * findLocalNamespace(const char *nsname) const
finds a subnamespace in this namespace, does not search child namespaces
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 bool isRoot() const
returns true if the namespace is the root namespace
DLLEXPORT void addSystemClass(QoreClass *oc)
adds a class to a namespace
DLLEXPORT QoreHashNode * getInfo() const
returns a hash giving information about the definitions in the namespace
DLLEXPORT QoreValue setKeyValue(const std::string &key, QoreValue val)
Sets a key value in the namespace's key-value store unconditionally.
DLLEXPORT bool isBuiltin() const
returns true if the namespace is builtin
DLLEXPORT const TypedHashDecl * findLocalTypedHash(const char *name) const
find a typed hash (hashdecl) in the current namespace; returns nullptr if not found
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 const QoreExternalFunction * findLocalFunction(const char *name) const
find a function in the current namespace; returns nullptr if not found
DLLEXPORT void deleteData(ExceptionSink *xsink)
this function must be called before the QoreNamespace object is deleted or a crash could result due i...
DLLEXPORT void addConstant(const char *name, QoreValue value)
adds a constant definition to the namespace
DLLEXPORT const char * getName() const
returns the name of 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 const QoreExternalConstant * findLocalConstant(const char *name) const
find a constant in the current namespace; returns nullptr if not found
DLLEXPORT QoreNamespace * findCreateNamespacePath(const char *nspath)
finds a Namespace based on the argument; creates it (or the whole path) if necessary
DLLEXPORT const QoreNamespace * getParent() const
returns a pointer to the parent namespace or nullptr if there is no parent
DLLEXPORT QoreValue getReferencedKeyValue(const std::string &key) const
Returns a referenced key value from the namespace's key-value store.
DLLEXPORT QoreProgram * getProgram() const
Returns the owning QoreProgram object (if not the static system 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 const char * getModuleName() const
Returns the module name the namespace was loaded from or nullptr if it is a builtin namespace.
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 const QoreExternalGlobalVar * findLocalGlobalVar(const char *name) const
find a global variable 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 QoreClass * findLoadLocalClass(const char *cname)
finds a class in this namespace, does not search child namespaces
virtual DLLEXPORT ~QoreNamespace()
destroys the object and frees memory
DLLEXPORT void addInitialNamespace(QoreNamespace *ns)
adds a subnamespace to the namespace
DLLEXPORT bool isModulePublic() const
returns true if the namespace has its module public flag set
DLLEXPORT bool isImported() const
returns true if the namespace was imported from another program object
DLLEXPORT QoreClass * findLocalClass(const char *cname) const
finds a class in this namespace, does not search child namespaces
allows all namespaces of a namespace to be iterated (including the namespace passed in the constructo...
Definition: QoreNamespace.h:436
DLLEXPORT QoreNamespace * operator*()
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 & get()
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 const QoreNamespace & get() const
returns the namespace
DLLEXPORT bool next()
moves to the next position; returns true if on a valid position
DLLEXPORT QoreNamespaceNamespaceIterator(const QoreNamespace &ns)
creates the iterator
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:127
the root namespace of a QoreProgram object
Definition: QoreNamespace.h:397
DLLEXPORT QoreNamespace * rootGetQoreNamespace() const
returns a pointer to the QoreNamespace for the "Qore" namespace
DLLEXPORT QoreProgram * getProgram() const
Returns the owning QoreProgram object (if not the static system 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:275