WPILibC++  trunk
ArrayEntryType.cpp
1 /*
2  * ArrayEntryType.cpp
3  *
4  * Created on: Nov 14, 2012
5  * Author: Mitchell Wills
6  */
7 
8 #include "networktables2/type/ArrayEntryType.h"
9 
11  : ComplexEntryType(id, "Array"), m_elementType(elementType){ //TODO super(id, "Array of [" + elementType.name + "]");
12 }
13 
15  return m_elementType.copyValue(value);
16 }
18  m_elementType.deleteValue(value);
19 }
21  return m_elementType.areEqual(v1, v2);
22 }
23 
24 
26  ArrayEntryData* dataArray = (ArrayEntryData*) value.ptr;
27  /*if (dataArray->length > 255) {//TODO throw better exception
28  throw IOException("Cannot write " + value + " as " + name + ". Arrays have a max length of 255 values");
29  }*/
30  os.writeByte(dataArray->length);
31  for (int i = 0; i < dataArray->length; ++i) {
32  m_elementType.sendValue(dataArray->array[i], os);
33  }
34 }
35 
37  uint8_t length = is.readByte();
38  EntryValue* array = (EntryValue*)malloc(length*sizeof(EntryValue));//TODO cache object arrays
39  for (int i = 0; i < length; ++i) {
40  array[i] = m_elementType.readValue(is);
41  }
42 
43  ArrayEntryData* dataArray = (ArrayEntryData*)malloc(sizeof(ArrayEntryData));
44  dataArray->length = length;
45  dataArray->array = array;
46 
47  EntryValue eValue;
48  eValue.ptr = dataArray;
49  return eValue;
50 }
51 
53  ArrayEntryData* otherDataArray = (ArrayEntryData*) value.ptr;
54 
55  EntryValue* array = (EntryValue*)malloc(otherDataArray->length*sizeof(EntryValue));
56  for (int i = 0; i < otherDataArray->length; ++i) {
57  array[i] = copyElement(otherDataArray->array[i]);
58  }
59 
60  ArrayEntryData* dataArray = (ArrayEntryData*)malloc(sizeof(ArrayEntryData));
61  dataArray->length = otherDataArray->length;
62  dataArray->array = array;
63 
64  EntryValue eValue;
65  eValue.ptr = dataArray;
66  return eValue;
67 }
69  ArrayEntryData* dataArray = (ArrayEntryData*) value.ptr;
70  if(dataArray!=NULL){
71  for (int i = 0; i < dataArray->length; ++i) {
72  deleteElement(dataArray->array[i]);
73  }
74  if(dataArray->array != NULL)
75  free(dataArray->array);
76 
77  free(dataArray);
78  }
79 }
81  ArrayEntryData* a1 = (ArrayEntryData*) v1.ptr;
82  ArrayEntryData* a2 = (ArrayEntryData*) v2.ptr;
83  if(a1->length != a2->length)
84  return false;
85  for (int i = 0; i < a1->length; ++i) {
86  if(!areElementsEqual(a1->array[i], a2->array[i]))
87  return false;
88  }
89  return true;
90 }
91 
92 EntryValue ArrayEntryType::internalizeValue(std::string& key, ComplexData& externalRepresentation, EntryValue currentInteralValue) {
93  // TODO: Argument 'key' appears unused.
94  ArrayData& externalArrayData = (ArrayData&)externalRepresentation;
95 
96  EntryValue eValue = currentInteralValue;
97  ArrayEntryData* internalArray = (ArrayEntryData*) currentInteralValue.ptr;
98  if(internalArray == NULL){
99  internalArray = (ArrayEntryData*)malloc(sizeof(ArrayEntryData));
100  internalArray->length = 0;
101  internalArray->array = NULL;
102  eValue.ptr = internalArray;
103  }
104 
105  if(internalArray->length==externalArrayData.size()){
106  for(int i = 0; i<internalArray->length; ++i){
107  deleteElement(internalArray->array[i]);
108  internalArray->array[i] = copyElement(externalArrayData._get(i));
109  }
110  }
111  else{
112  if(internalArray->array != NULL)
113  free(internalArray->array);
114  internalArray->length = externalArrayData.size();
115  if(internalArray->length == 0)
116  internalArray->array = NULL;
117  else
118  internalArray->array = (EntryValue*)malloc(externalArrayData.size()*sizeof(EntryValue));
119  for (int i = 0; i < internalArray->length; ++i) {
120  internalArray->array[i] = copyElement(externalArrayData._get(i));
121  }
122  }
123  return eValue;
124 }
125 
126 void ArrayEntryType::exportValue(std::string& key, EntryValue internalData, ComplexData& externalRepresentation) {
127  ArrayEntryData* internalArray = (ArrayEntryData*) internalData.ptr;
128  ArrayData& externalArrayData = (ArrayData&)externalRepresentation;
129  externalArrayData.setSize(internalArray->length);
130  for(int i = 0; i<internalArray->length; ++i){
131  externalArrayData._set(i, copyElement(internalArray->array[i]));
132  }
133 }
virtual void sendValue(EntryValue value, DataIOStream &os)=0
void deleteValue(EntryValue value)
virtual EntryValue readValue(DataIOStream &is)=0
EntryValue copyElement(EntryValue value)
EntryValue _get(unsigned int index)
Definition: ArrayData.cpp:25
bool areEqual(EntryValue v1, EntryValue v2)
void sendValue(EntryValue value, DataIOStream &os)
EntryValue copyValue(EntryValue value)
void deleteElement(EntryValue value)
ArrayEntryType(TypeId id, NetworkTableEntryType &elementType)
EntryValue internalizeValue(std::string &key, ComplexData &externalRepresentation, EntryValue currentInteralValue)
virtual EntryValue copyValue(EntryValue value)
unsigned int size()
Definition: ArrayData.cpp:73
bool areElementsEqual(EntryValue v1, EntryValue v2)
void exportValue(std::string &key, EntryValue internalData, ComplexData &externalRepresentation)
EntryValue readValue(DataIOStream &is)
Definition: ITable.h:13
virtual bool areEqual(EntryValue v1, EntryValue v2)=0
virtual void deleteValue(EntryValue value)