0
|
1 //
|
|
2 // MessagePack for Java
|
|
3 //
|
|
4 // Copyright (C) 2009 - 2013 FURUHASHI Sadayuki
|
|
5 //
|
|
6 // Licensed under the Apache License, Version 2.0 (the "License");
|
|
7 // you may not use this file except in compliance with the License.
|
|
8 // You may obtain a copy of the License at
|
|
9 //
|
|
10 // http://www.apache.org/licenses/LICENSE-2.0
|
|
11 //
|
|
12 // Unless required by applicable law or agreed to in writing, software
|
|
13 // distributed under the License is distributed on an "AS IS" BASIS,
|
|
14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15 // See the License for the specific language governing permissions and
|
|
16 // limitations under the License.
|
|
17 //
|
|
18 package org.msgpack.type;
|
|
19
|
|
20 import java.util.ListIterator;
|
|
21 import java.io.IOException;
|
|
22 import org.msgpack.packer.Packer;
|
|
23
|
|
24 class ArrayValueImpl extends AbstractArrayValue {
|
|
25 private static ArrayValueImpl emptyInstance = new ArrayValueImpl(new Value[0], true);
|
|
26
|
|
27 public static ArrayValue getEmptyInstance() {
|
|
28 return emptyInstance;
|
|
29 }
|
|
30
|
|
31 private Value[] array;
|
|
32
|
|
33 @Override
|
|
34 public Value[] getElementArray() {
|
|
35 return array;
|
|
36 }
|
|
37
|
|
38 ArrayValueImpl(Value[] array, boolean gift) {
|
|
39 if (gift) {
|
|
40 this.array = array;
|
|
41 } else {
|
|
42 this.array = new Value[array.length];
|
|
43 System.arraycopy(array, 0, this.array, 0, array.length);
|
|
44 }
|
|
45 }
|
|
46
|
|
47 @Override
|
|
48 public int size() {
|
|
49 return array.length;
|
|
50 }
|
|
51
|
|
52 @Override
|
|
53 public boolean isEmpty() {
|
|
54 return array.length == 0;
|
|
55 }
|
|
56
|
|
57 @Override
|
|
58 public Value get(int index) {
|
|
59 if (index < 0 || array.length <= index) {
|
|
60 throw new IndexOutOfBoundsException();
|
|
61 }
|
|
62 return array[index];
|
|
63 }
|
|
64
|
|
65 @Override
|
|
66 public int indexOf(Object o) {
|
|
67 if (o == null) {
|
|
68 return -1; // FIXME NullPointerException?
|
|
69 }
|
|
70 for (int i = 0; i < array.length; i++) {
|
|
71 if (array[i].equals(o)) {
|
|
72 return i;
|
|
73 }
|
|
74 }
|
|
75 return -1;
|
|
76 }
|
|
77
|
|
78 @Override
|
|
79 public int lastIndexOf(Object o) {
|
|
80 if (o == null) {
|
|
81 return -1; // FIXME NullPointerException?
|
|
82 }
|
|
83 for (int i = array.length - 1; i >= 0; i--) {
|
|
84 if (array[i].equals(o)) {
|
|
85 return i;
|
|
86 }
|
|
87 }
|
|
88 return -1;
|
|
89 }
|
|
90
|
|
91 @Override
|
|
92 public void writeTo(Packer pk) throws IOException {
|
|
93 pk.writeArrayBegin(array.length);
|
|
94 for (int i = 0; i < array.length; i++) {
|
|
95 array[i].writeTo(pk);
|
|
96 }
|
|
97 pk.writeArrayEnd();
|
|
98 }
|
|
99
|
|
100 @Override
|
|
101 public boolean equals(Object o) {
|
|
102 if (o == this) {
|
|
103 return true;
|
|
104 }
|
|
105 if (!(o instanceof Value)) {
|
|
106 return false;
|
|
107 }
|
|
108 Value v = (Value) o;
|
|
109 if (!v.isArrayValue()) {
|
|
110 return false;
|
|
111 }
|
|
112
|
|
113 if (v.getClass() == ArrayValueImpl.class) {
|
|
114 return equals((ArrayValueImpl) v);
|
|
115 }
|
|
116
|
|
117 ListIterator<Value> oi = v.asArrayValue().listIterator();
|
|
118 int i = 0;
|
|
119 while (i < array.length) {
|
|
120 if (!oi.hasNext() || !array[i].equals(oi.next())) {
|
|
121 return false;
|
|
122 }
|
|
123 i++;
|
|
124 }
|
|
125 return !oi.hasNext();
|
|
126 }
|
|
127
|
|
128 private boolean equals(ArrayValueImpl o) {
|
|
129 if (array.length != o.array.length) {
|
|
130 return false;
|
|
131 }
|
|
132 for (int i = 0; i < array.length; i++) {
|
|
133 if (!array[i].equals(o.array[i])) {
|
|
134 return false;
|
|
135 }
|
|
136 }
|
|
137 return true;
|
|
138 }
|
|
139
|
|
140 // TODO compareTo?
|
|
141
|
|
142 @Override
|
|
143 public int hashCode() {
|
|
144 int h = 1;
|
|
145 for (int i = 0; i < array.length; i++) {
|
|
146 Value obj = array[i];
|
|
147 h = 31 * h + obj.hashCode();
|
|
148 }
|
|
149 return h;
|
|
150 }
|
|
151
|
|
152 @Override
|
|
153 public String toString() {
|
|
154 return toString(new StringBuilder()).toString();
|
|
155 }
|
|
156
|
|
157 @Override
|
|
158 public StringBuilder toString(StringBuilder sb) {
|
|
159 if (array.length == 0) {
|
|
160 return sb.append("[]");
|
|
161 }
|
|
162 sb.append("[");
|
|
163 sb.append(array[0]);
|
|
164 for (int i = 1; i < array.length; i++) {
|
|
165 sb.append(",");
|
|
166 array[i].toString(sb);
|
|
167 }
|
|
168 sb.append("]");
|
|
169 return sb;
|
|
170 }
|
|
171 }
|