/*******************************************************************************
* Copyright (c) 2010, 2014 Willink Transformations and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* E.D.Willink - Initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.pivot.internal.values;
import java.util.Collection;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.ids.CollectionTypeId;
import org.eclipse.ocl.pivot.ids.TypeId;
import org.eclipse.ocl.pivot.messages.PivotMessages;
import org.eclipse.ocl.pivot.values.InvalidValueException;
import org.eclipse.ocl.pivot.values.OrderedSet;
import org.eclipse.ocl.pivot.values.OrderedSetValue;
import org.eclipse.ocl.pivot.values.SequenceValue;
/**
* @generated NOT
*/
public class SparseOrderedSetValueImpl extends OrderedSetValueImpl
{
public static @NonNull OrderedSet<Object> createOrderedSetOfEach(@Nullable Object @NonNull [] boxedValues) {
OrderedSet<Object> result = new OrderedSetImpl<Object>();
for (Object boxedValue : boxedValues) {
result.add(boxedValue);
}
return result;
}
public static class Accumulator extends SparseOrderedSetValueImpl implements OrderedSetValue.Accumulator
{
public Accumulator(@NonNull CollectionTypeId typeId) {
super(typeId, new OrderedSetImpl<Object>());
}
@Override
@SuppressWarnings("unchecked")
public boolean add(@Nullable Object value) {
return ((Collection<Object>)elements).add(value);
}
}
public SparseOrderedSetValueImpl(@NonNull CollectionTypeId typeId, @NonNull Collection<? extends Object> boxedValues) {
super(typeId, boxedValues);
}
@Override
public @NonNull OrderedSetValue append(@Nullable Object object) {
if (object instanceof InvalidValueException) {
throw new InvalidValueException(PivotMessages.InvalidSource, "append");
}
OrderedSet<Object> result = new OrderedSetImpl<Object>(elements);
result.remove(object); // appended object must be last
result.add(object);
return new SparseOrderedSetValueImpl(getTypeId(), result);
}
@Override
public @Nullable Object first() {
if (elements.size() <= 0) {
throw new InvalidValueException(PivotMessages.EmptyCollection, TypeId.ORDERED_SET_NAME, "first");
}
return elements.iterator().next();
}
@Override
public @NonNull OrderedSetValue flatten() {
OrderedSet<Object> flattened = new OrderedSetImpl<Object>();
if (flatten(flattened)) {
return new SparseOrderedSetValueImpl(getTypeId(), flattened);
}
else {
return this;
}
}
// @Override
// protected @NonNull OrderedSet<? extends Object> getElements() {
// return (OrderedSet<? extends Object>) elements;
// }
@Override
public @NonNull OrderedSetValue including(@Nullable Object value) {
if (value instanceof InvalidValueException) {
throw new InvalidValueException(PivotMessages.InvalidSource, "including");
}
OrderedSet<Object> result = new OrderedSetImpl<Object>(elements);
result.add(value);
return new SparseOrderedSetValueImpl(getTypeId(), result);
}
@Override
public @Nullable Object last() {
if (elements.size() <= 0) {
throw new InvalidValueException(PivotMessages.EmptyCollection, TypeId.ORDERED_SET_NAME, "last");
}
Object result = null;
for (Object next : elements) {
result = next;
}
return result;
}
@Override
public @NonNull OrderedSetValue prepend(@Nullable Object object) {
if (object instanceof InvalidValueException) {
throw new InvalidValueException(PivotMessages.InvalidSource, "prepend");
}
OrderedSet<Object> result = new OrderedSetImpl<Object>();
result.add(object);
result.addAll(elements);
return new SparseOrderedSetValueImpl(getTypeId(), result);
}
@Override
public SequenceValue toSequenceValue() {
return new SparseSequenceValueImpl(getSequenceTypeId(), SparseSequenceValueImpl.createSequenceOfEach(elements));
}
@Override
public void toString(@NonNull StringBuilder s, int lengthLimit) {
s.append(TypeId.ORDERED_SET_NAME);
super.toString(s, lengthLimit);
}
}