Qore Programming Language 2.1.1
Loading...
Searching...
No Matches
QoreListNode.h
1/* -*- mode: c++; indent-tabs-mode: nil -*- */
2/*
3 QoreListNode.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_QORELISTNODE_H
33
34#define _QORE_QORELISTNODE_H
35
36#include <qore/AbstractQoreNode.h>
37
38#ifdef min
39#undef min
40#endif
41#ifdef max
42#undef max
43#endif
44
46
48
53 friend class StackList;
54 friend hashdecl qore_list_private;
55
56private:
58 DLLLOCAL QoreListNode(const QoreListNode&);
59
61 DLLLOCAL QoreListNode& operator=(const QoreListNode&);
62
63protected:
65
67 hashdecl qore_list_private *priv;
68
70
74 DLLEXPORT virtual ~QoreListNode();
75
77
83 DLLEXPORT virtual bool derefImpl(ExceptionSink* xsink);
84
86
89 DLLLOCAL virtual QoreValue evalImpl(bool& needs_deref, ExceptionSink* xsink) const;
90
91public:
93 DLLEXPORT QoreListNode();
94
96 DLLEXPORT QoreListNode(const QoreTypeInfo* valueTypeInfo);
97
99
101 DLLEXPORT virtual bool getAsBoolImpl() const;
102
104
110 DLLEXPORT int getAsString(QoreString &str, int foff, ExceptionSink* xsink) const;
111
113
120 DLLEXPORT QoreString *getAsString(bool &del, int foff, ExceptionSink* xsink) const;
121
123 //DLLEXPORT virtual bool needs_eval() const;
124
126 DLLEXPORT virtual AbstractQoreNode* realCopy() const;
127
129
133 DLLEXPORT virtual bool is_equal_soft(const AbstractQoreNode* v, ExceptionSink* xsink) const;
134
136
140 DLLEXPORT virtual bool is_equal_hard(const AbstractQoreNode* v, ExceptionSink* xsink) const;
141
143 DLLEXPORT virtual const char *getTypeName() const;
144
146 //DLLEXPORT virtual bool is_value() const;
147
148 DLLLOCAL static const char *getStaticTypeName() {
149 return "list";
150 }
151
152 DLLEXPORT QoreValue& getEntryReference(size_t index);
153
155
159 DLLEXPORT QoreValue retrieveEntry(size_t index);
160
162
166 DLLEXPORT const QoreValue retrieveEntry(size_t index) const;
167
169
173 DLLEXPORT QoreValue getReferencedEntry(size_t index) const;
174
176
179 DLLEXPORT int getEntryAsInt(size_t index) const;
180
182
188 DLLEXPORT int setEntry(size_t index, QoreValue val, ExceptionSink* xsink);
189
191
193 DLLEXPORT int push(QoreValue val, ExceptionSink* xsink);
194
196
198 DLLEXPORT int insert(QoreValue val, ExceptionSink* xsink);
199
201
205 DLLEXPORT QoreValue pop();
206
208
213 DLLEXPORT QoreValue shift();
214
216
218 DLLEXPORT int merge(const QoreListNode* list, ExceptionSink* xsink);
219
221
227 DLLEXPORT QoreListNode* evalList(ExceptionSink* xsink) const;
228
230
237 DLLEXPORT QoreListNode* evalList(bool &needs_deref, ExceptionSink* xsink) const;
238
240 DLLEXPORT QoreListNode* copy() const;
241
243
246 DLLEXPORT QoreListNode* copyListFrom(size_t index) const;
247
249
252 DLLEXPORT QoreListNode* sort(ExceptionSink* xsink) const;
253
255
259 DLLEXPORT QoreListNode* sort(const ResolvedCallReferenceNode* fr, ExceptionSink* xsink) const;
260
262
265 DLLEXPORT QoreListNode* sortStable(ExceptionSink* xsink) const;
266
268
273
275
278 DLLEXPORT QoreListNode* sortDescending(ExceptionSink* xsink) const;
279
281
286
288
292
294
299
301
304 DLLEXPORT QoreValue min(ExceptionSink* xsink) const;
305
307
310 DLLEXPORT QoreValue max(ExceptionSink* xsink) const;
311
313
317 DLLEXPORT QoreValue min(const ResolvedCallReferenceNode* fr, ExceptionSink* xsink) const;
318
320
324 DLLEXPORT QoreValue max(const ResolvedCallReferenceNode* fr, ExceptionSink* xsink) const;
325
327
335
337
345 DLLEXPORT QoreListNode* splice(qore_offset_t offset, qore_offset_t length);
346
348
359 DLLEXPORT QoreListNode* splice(qore_offset_t offset, qore_offset_t length, const QoreValue l, ExceptionSink* xsink);
360
362
368
370
377
379
387 DLLEXPORT QoreListNode* extract(qore_offset_t offset, qore_offset_t length, const QoreValue l, ExceptionSink* xsink);
388
390
392 DLLEXPORT size_t size() const;
393
395
397 DLLEXPORT bool empty() const;
398
400 DLLEXPORT QoreListNode* reverse() const;
401
403 DLLEXPORT QoreListNode* listRefSelf() const;
404
406
408 DLLEXPORT const QoreTypeInfo* getValueTypeInfo() const;
409
411
413 DLLEXPORT const QoreTypeInfo* getTypeInfo() const;
414
416
418 DLLEXPORT void weakRef();
419
421
425 DLLEXPORT bool weakDeref();
426
427 // needed only while parsing
429 DLLLOCAL QoreListNode(bool i);
430
432 DLLLOCAL bool isFinalized() const;
433
435 DLLLOCAL void setFinalized();
436
438 DLLLOCAL bool isVariableList() const;
439
441 DLLLOCAL void setVariableList();
442
444 DLLLOCAL virtual int parseInit(QoreValue& val, QoreParseContext& parse_context);
445};
446
447#include <qore/ReferenceHolder.h>
448
450
454
456
476protected:
477 QoreListNode* l;
478 qore_offset_t pos;
479
481 DLLLOCAL void *operator new(size_t);
482
483public:
485
488 DLLEXPORT ListIterator(QoreListNode* lst, size_t n_pos = -1);
489
491
494 DLLEXPORT ListIterator(QoreListNode& lst, size_t n_pos = -1);
495
497
502 DLLEXPORT bool next();
503
505
511 DLLEXPORT bool prev();
512
514
519 DLLEXPORT int set(size_t n_pos);
520
522
524 DLLEXPORT QoreValue getReferencedValue() const;
525
527 DLLEXPORT QoreValue getValue() const;
528
530 DLLEXPORT bool first() const;
531
533 DLLEXPORT bool last() const;
534
536 DLLLOCAL size_t index() const { return pos; }
537
539 DLLLOCAL size_t max() const { return l->size(); }
540
542 DLLLOCAL QoreListNode* getList() { return l; }
543
545 DLLLOCAL bool empty() const {
546 return l->empty();
547 }
548
550 DLLLOCAL bool valid() const {
551 return pos == -1 ? false : true;
552 }
553};
554
556
576protected:
577 const QoreListNode* l;
578 qore_offset_t pos;
579
580public:
582
585 DLLEXPORT ConstListIterator(const QoreListNode* lst, size_t n_pos = -1);
586
588
591 DLLEXPORT ConstListIterator(const QoreListNode& lst, size_t n_pos = -1);
592
594
599 DLLEXPORT bool next();
600
602
608 DLLEXPORT bool prev();
609
611
616 DLLEXPORT int set(size_t n_pos);
617
619
621 DLLEXPORT QoreValue getReferencedValue() const;
622
624 DLLEXPORT const QoreValue getValue() const;
625
627 DLLEXPORT bool first() const;
628
630 DLLEXPORT bool last() const;
631
633 DLLLOCAL size_t index() const { return pos; }
634
636 DLLLOCAL size_t max() const { return l->size(); }
637
639 DLLLOCAL const QoreListNode* getList() const { return l; }
640
642 DLLLOCAL bool empty() const {
643 return l->empty();
644 }
645
647 DLLLOCAL bool valid() const {
648 return pos == -1 ? false : true;
649 }
650
652 DLLEXPORT void reset();
653};
654
655#endif
The base class for all value and parse types in Qore expression trees.
Definition AbstractQoreNode.h:57
For use on the stack only: iterates through elements of a const QoreListNode.
Definition QoreListNode.h:575
DLLEXPORT bool prev()
moves the iterator to the previous element, returns true if the iterator is pointing to an element of...
DLLLOCAL bool valid() const
returns true if the iterator is pointing to a valid element
Definition QoreListNode.h:647
DLLLOCAL bool empty() const
returns true if the list is empty
Definition QoreListNode.h:642
DLLEXPORT QoreValue getReferencedValue() const
returns the referenced value of the list element
DLLEXPORT bool next()
moves the iterator to the next element, returns true if the iterator is pointing to an element of the...
DLLEXPORT int set(size_t n_pos)
sets the iterator to a specific position in the list
DLLLOCAL size_t max() const
returns the number of elements in the list
Definition QoreListNode.h:636
DLLEXPORT const QoreValue getValue() const
returns a pointer to the value of the list element
DLLEXPORT void reset()
resets the iterator to its initial state
DLLEXPORT bool first() const
returns true when the iterator is pointing to the first element in the list
DLLLOCAL const QoreListNode * getList() const
returns the list
Definition QoreListNode.h:639
DLLEXPORT ConstListIterator(const QoreListNode &lst, size_t n_pos=-1)
initializes the iterator to the position given or, if omitted, just before the first element
DLLLOCAL size_t index() const
returns the current iterator position in the list or -1 if not pointing at a valid element
Definition QoreListNode.h:633
DLLEXPORT bool last() const
returns true when the iterator is pointing to the last element in the list
DLLEXPORT ConstListIterator(const QoreListNode *lst, size_t n_pos=-1)
initializes the iterator to the position given or, if omitted, just before the first element
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition ExceptionSink.h:50
For use on the stack only: iterates through a the elements of a QoreListNode.
Definition QoreListNode.h:475
DLLLOCAL size_t max() const
returns the number of elements in the list
Definition QoreListNode.h:539
DLLLOCAL bool empty() const
returns true if the list is empty
Definition QoreListNode.h:545
DLLEXPORT QoreValue getValue() const
returns a pointer to the value of the list element
DLLEXPORT bool last() const
returns true when the iterator is pointing to the last element in the list
DLLEXPORT ListIterator(QoreListNode *lst, size_t n_pos=-1)
initializes the iterator to the position given or, if omitted, just before the first element
DLLEXPORT bool prev()
moves the iterator to the previous element, returns true if the iterator is pointing to an element of...
DLLEXPORT bool first() const
returns true when the iterator is pointing to the first element in the list
DLLLOCAL QoreListNode * getList()
returns the list
Definition QoreListNode.h:542
DLLEXPORT int set(size_t n_pos)
sets the iterator to a specific position in the list
DLLLOCAL bool valid() const
returns true if the iterator is pointing to a valid element
Definition QoreListNode.h:550
DLLEXPORT bool next()
moves the iterator to the next element, returns true if the iterator is pointing to an element of the...
DLLEXPORT QoreValue getReferencedValue() const
returns the referenced value of the list element
DLLEXPORT ListIterator(QoreListNode &lst, size_t n_pos=-1)
initializes the iterator to the position given or, if omitted, just before the first element
DLLLOCAL size_t index() const
returns the current iterator position in the list or -1 if not pointing at a valid element
Definition QoreListNode.h:536
This is the list container type in Qore, dynamically allocated only, reference counted.
Definition QoreListNode.h:52
virtual DLLEXPORT bool getAsBoolImpl() const
returns false unless perl-boolean-evaluation is enabled, in which case it returns false only when emp...
DLLEXPORT QoreListNode * splice(qore_offset_t offset)
truncates the list at position "offset" (first element is offset 0) and returns any elements removed ...
DLLEXPORT QoreListNode * sortDescendingStable(ExceptionSink *xsink) const
returns a new list based on executing mergesort on the source list ("this") in descending order
DLLEXPORT QoreListNode * evalList(ExceptionSink *xsink) const
evaluates the list and returns a value (or 0)
hashdecl qore_list_private * priv
this structure holds the private implementation for the type
Definition QoreListNode.h:67
DLLLOCAL bool isVariableList() const
this function is not exported in the qore library
DLLLOCAL QoreListNode(bool i)
this function is not exported in the qore library
DLLEXPORT QoreValue shift()
returns the first element of the list, all other entries are moved down to fill up the first position...
virtual DLLEXPORT bool is_equal_soft(const AbstractQoreNode *v, ExceptionSink *xsink) const
tests for equality ("deep compare" including all contained values) with possible type conversion (sof...
DLLEXPORT QoreValue min(ExceptionSink *xsink) const
returns the element having the lowest value (determined by calling OP_LOG_LT - the less-than "<" oper...
DLLEXPORT QoreListNode * extract(qore_offset_t offset)
truncates the list at position "offset" (first element is offset 0) and returns any elements removed ...
DLLEXPORT size_t size() const
returns the number of elements in the list
DLLEXPORT int merge(const QoreListNode *list, ExceptionSink *xsink)
appends the elements of "list" to this list
DLLEXPORT QoreListNode * sort(const ResolvedCallReferenceNode *fr, ExceptionSink *xsink) const
returns a new list based on quicksorting the source list ("this") using the passed function reference...
DLLEXPORT QoreListNode * sortDescending(ExceptionSink *xsink) const
returns a new list based on quicksorting the source list ("this") in descending order
virtual DLLEXPORT bool is_equal_hard(const AbstractQoreNode *v, ExceptionSink *xsink) const
tests for equality ("deep compare" including all contained values) without type conversions (hard com...
DLLEXPORT QoreListNode * sortStable(const ResolvedCallReferenceNode *fr, ExceptionSink *xsink) const
returns a new list based on executing mergesort on the source list ("this") using the passed function...
DLLEXPORT int push(QoreValue val, ExceptionSink *xsink)
adds a value to the list
static DLLLOCAL const char * getStaticTypeName()
returns true if the list does not contain any parse expressions, otherwise returns false
Definition QoreListNode.h:148
virtual DLLEXPORT ~QoreListNode()
the destructor is protected so it cannot be called directly
DLLEXPORT QoreValue getReferencedEntry(size_t index) const
returns the element at "index" (first element is index 0), the caller owns the reference
DLLEXPORT QoreListNode * reverse() const
returns a list with the order of the elements reversed
DLLEXPORT const QoreTypeInfo * getValueTypeInfo() const
returns the value type declaration (if set)
DLLEXPORT void weakRef()
Increments the weak reference count for this object.
DLLEXPORT int getAsString(QoreString &str, int foff, ExceptionSink *xsink) const
concatenate the verbose string representation of the list (including all contained values) to an exis...
DLLEXPORT int setEntry(size_t index, QoreValue val, ExceptionSink *xsink)
sets the value of a list element
virtual DLLEXPORT AbstractQoreNode * realCopy() const
returns true if the list contains parse expressions and therefore needs evaluation to return a value,...
DLLLOCAL void setFinalized()
this function is not exported in the qore library
DLLEXPORT QoreListNode * splice(qore_offset_t offset, qore_offset_t length, const QoreValue l, ExceptionSink *xsink)
adds a single value or a list of values ("l") to list possition "offset", while removing "length" ele...
DLLEXPORT QoreListNode * sortDescending(const ResolvedCallReferenceNode *fr, ExceptionSink *xsink) const
returns a new list based on quicksorting the source list ("this") in descending order,...
DLLEXPORT QoreValue max(const ResolvedCallReferenceNode *fr, ExceptionSink *xsink) const
returns the element having the highest value (determined by calling the function reference passed to ...
DLLEXPORT QoreListNode(const QoreTypeInfo *valueTypeInfo)
creates an empty list with the given value type
DLLEXPORT QoreListNode * copy() const
performs a deep copy of the list and returns the new list
DLLEXPORT QoreListNode * extract(qore_offset_t offset, qore_offset_t length)
removes "length" elements at position "offset" (first element is offset 0) and returns any elements r...
DLLEXPORT QoreListNode * splice(qore_offset_t offset, qore_offset_t length)
removes "length" elements at position "offset" (first element is offset 0) and returns any elements r...
DLLEXPORT QoreValue retrieveEntry(size_t index)
returns the element at "index" (first element is index 0)
DLLEXPORT const QoreTypeInfo * getTypeInfo() const
returns the type info structure for the current value; also works for lists with a specific value typ...
virtual DLLEXPORT bool derefImpl(ExceptionSink *xsink)
dereferences all elements of the list
DLLEXPORT int getEntryAsInt(size_t index) const
returns the value of element at "index" as an integer (first element is index 0)
DLLEXPORT QoreValue max(ExceptionSink *xsink) const
returns the element having the highest value (determined by calling OP_LOG_GT - the greater-than ">" ...
DLLEXPORT QoreListNode * extract(qore_offset_t offset, qore_offset_t length, const QoreValue l, ExceptionSink *xsink)
adds a single value or a list of values ("l") to list possition "offset", while removing "length" ele...
DLLEXPORT QoreListNode * listRefSelf() const
returns "this" with an incremented reference count
DLLEXPORT QoreValue min(const ResolvedCallReferenceNode *fr, ExceptionSink *xsink) const
returns the element having the lowest value (determined by calling the function reference passed to g...
DLLEXPORT QoreListNode * copyListFrom(size_t index) const
performs a deep copy of the list starting from element "offset" and returns the new list
DLLEXPORT QoreListNode * sortDescendingStable(const ResolvedCallReferenceNode *fr, ExceptionSink *xsink) const
returns a new list based on executing mergesort on the source list ("this") in descending order,...
DLLEXPORT const QoreValue retrieveEntry(size_t index) const
returns the element at "index" (first element is index 0)
DLLEXPORT int insert(QoreValue val, ExceptionSink *xsink)
inserts a value in the first position of the list
DLLEXPORT QoreListNode * evalList(bool &needs_deref, ExceptionSink *xsink) const
optionally evaluates the list
virtual DLLLOCAL int parseInit(QoreValue &val, QoreParseContext &parse_context)
for initialization of lists in the parse tree at parse time (always returns "this")
virtual DLLLOCAL QoreValue evalImpl(bool &needs_deref, ExceptionSink *xsink) const
optionally evaluates the argument
DLLEXPORT QoreListNode()
create an empty list
DLLEXPORT QoreListNode * sortStable(ExceptionSink *xsink) const
returns a new list based on executing mergesort on the source list ("this")
DLLEXPORT QoreListNode * sort(ExceptionSink *xsink) const
returns a new list based on quicksorting the source list ("this")
DLLEXPORT bool empty() const
returns true if the list is empty
DLLEXPORT QoreString * getAsString(bool &del, int foff, ExceptionSink *xsink) const
returns a QoreString giving the verbose string representation of the List (including all contained va...
DLLEXPORT QoreValue pop()
returns the last element of the list, the length is decremented by one, caller owns the reference
DLLLOCAL bool isFinalized() const
this function is not exported in the qore library
DLLEXPORT bool weakDeref()
Decrements the weak reference count for this object.
DLLLOCAL void setVariableList()
this function is not exported in the qore library
virtual DLLEXPORT const char * getTypeName() const
returns the type name as a c string
Qore's string type supported by the QoreEncoding class.
Definition QoreString.h:93
a templated class to manage a reference count of an object that can throw a Qore-language exception w...
Definition ReferenceHolder.h:52
base class for resolved call references
Definition CallReferenceNode.h:115
intptr_t qore_offset_t
used for offsets that could be negative
Definition common.h:82
The main value class in Qore, designed to be passed by value.
Definition QoreValue.h:279