1/* 2 * Copyright 2013-2015, Rene Gollent, rene@gollent.com. 3 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 4 * Distributed under the terms of the MIT License. 5 */ 6#ifndef ARRAY_VALUE_NODE_H 7#define ARRAY_VALUE_NODE_H 8 9 10#include <ObjectList.h> 11 12#include "ValueNode.h" 13 14 15class AbstractArrayValueNodeChild; 16class ArrayType; 17 18 19class AbstractArrayValueNode : public ValueNode { 20public: 21 AbstractArrayValueNode( 22 ValueNodeChild* nodeChild, ArrayType* type, 23 int32 dimension); 24 virtual ~AbstractArrayValueNode(); 25 26 ArrayType* GetArrayType() const 27 { return fType; } 28 int32 Dimension() const 29 { return fDimension; } 30 31 virtual Type* GetType() const; 32 33 virtual status_t ResolvedLocationAndValue( 34 ValueLoader* valueLoader, 35 ValueLocation*& _location, 36 Value*& _value); 37 38 // locking required 39 40 virtual status_t CreateChildren(TeamTypeInformation* info); 41 virtual int32 CountChildren() const; 42 virtual ValueNodeChild* ChildAt(int32 index) const; 43 44 virtual bool IsRangedContainer() const; 45 virtual void ClearChildren(); 46 virtual status_t CreateChildrenInRange( 47 TeamTypeInformation* info, 48 int32 lowIndex, int32 highIndex); 49 virtual status_t SupportedChildRange(int32& lowIndex, 50 int32& highIndex) const; 51protected: 52 typedef BObjectList<AbstractArrayValueNodeChild> ChildList; 53 54protected: 55 ArrayType* fType; 56 ChildList fChildren; 57 int32 fDimension; 58 int32 fLowerBound; 59 int32 fUpperBound; 60 bool fBoundsInitialized; 61}; 62 63 64// TODO: Are ArrayValueNode and InternalArrayValueNode still needed? 65 66class ArrayValueNode : public AbstractArrayValueNode { 67public: 68 ArrayValueNode(ValueNodeChild* nodeChild, 69 ArrayType* type); 70 virtual ~ArrayValueNode(); 71}; 72 73 74class InternalArrayValueNode : public AbstractArrayValueNode { 75public: 76 InternalArrayValueNode( 77 ValueNodeChild* nodeChild, 78 ArrayType* type, int32 dimension); 79 virtual ~InternalArrayValueNode(); 80}; 81 82 83class AbstractArrayValueNodeChild : public ValueNodeChild { 84public: 85 AbstractArrayValueNodeChild( 86 AbstractArrayValueNode* parent, 87 const BString& name, int64 elementIndex); 88 virtual ~AbstractArrayValueNodeChild(); 89 90 AbstractArrayValueNode* ArrayParent() const { return fParent; } 91 int32 ElementIndex() const { return fElementIndex; } 92 93 virtual const BString& Name() const; 94 virtual ValueNode* Parent() const; 95 96protected: 97 AbstractArrayValueNode* fParent; 98 BString fName; 99 int64 fElementIndex; 100}; 101 102 103class ArrayValueNodeChild : public AbstractArrayValueNodeChild { 104public: 105 ArrayValueNodeChild( 106 AbstractArrayValueNode* parent, 107 const BString& name, int64 elementIndex, 108 Type* type); 109 virtual ~ArrayValueNodeChild(); 110 111 virtual Type* GetType() const; 112 113 virtual status_t ResolveLocation(ValueLoader* valueLoader, 114 ValueLocation*& _location); 115 116private: 117 Type* fType; 118}; 119 120 121class InternalArrayValueNodeChild : public AbstractArrayValueNodeChild { 122public: 123 InternalArrayValueNodeChild( 124 AbstractArrayValueNode* parent, 125 const BString& name, int64 elementIndex, 126 ArrayType* type); 127 virtual ~InternalArrayValueNodeChild(); 128 129 virtual Type* GetType() const; 130 131 virtual bool IsInternal() const; 132 virtual status_t CreateInternalNode(ValueNode*& _node); 133 134 virtual status_t ResolveLocation(ValueLoader* valueLoader, 135 ValueLocation*& _location); 136 137private: 138 ArrayType* fType; 139}; 140 141 142#endif // ARRAY_VALUE_NODE_H 143