/*
* Copyright 2016 The original authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.sundr.codegen.model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import io.sundr.builder.Builder;
import io.sundr.builder.Nested;
import io.sundr.builder.Predicate;
import io.sundr.builder.VisitableBuilder;
public class WildcardRefFluentImpl<A extends WildcardRefFluent<A>> extends TypeRefFluentImpl<A> implements WildcardRefFluent<A>{
private List<VisitableBuilder<? extends TypeRef,?>> bounds = new ArrayList<VisitableBuilder<? extends TypeRef,?>>();
public WildcardRefFluentImpl(){
}
public WildcardRefFluentImpl(WildcardRef instance){
this.withBounds(instance.getBounds());
this.withAttributes(instance.getAttributes());
}
public A addToBounds(int index,TypeRef item){
if (item instanceof VoidRef){addToVoidRefBounds(index, (VoidRef)item);}
else if (item instanceof WildcardRef){addToWildcardRefBounds(index, (WildcardRef)item);}
else if (item instanceof PrimitiveRef){addToPrimitiveRefBounds(index, (PrimitiveRef)item);}
else if (item instanceof TypeParamRef){addToTypeParamRefBounds(index, (TypeParamRef)item);}
else if (item instanceof ClassRef){addToClassRefBounds(index, (ClassRef)item);}
return (A)this;
}
public A setToBounds(int index,TypeRef item){
if (item instanceof VoidRef){setToVoidRefBounds(index, (VoidRef)item);}
else if (item instanceof WildcardRef){setToWildcardRefBounds(index, (WildcardRef)item);}
else if (item instanceof PrimitiveRef){setToPrimitiveRefBounds(index, (PrimitiveRef)item);}
else if (item instanceof TypeParamRef){setToTypeParamRefBounds(index, (TypeParamRef)item);}
else if (item instanceof ClassRef){setToClassRefBounds(index, (ClassRef)item);}
return (A)this;
}
public A addToBounds(TypeRef... items){
for (TypeRef item : items) {
if (item instanceof VoidRef){addToVoidRefBounds((VoidRef)item);}
else if (item instanceof WildcardRef){addToWildcardRefBounds((WildcardRef)item);}
else if (item instanceof PrimitiveRef){addToPrimitiveRefBounds((PrimitiveRef)item);}
else if (item instanceof TypeParamRef){addToTypeParamRefBounds((TypeParamRef)item);}
else if (item instanceof ClassRef){addToClassRefBounds((ClassRef)item);}
} return (A)this;
}
public A addAllToBounds(Collection<TypeRef> items){
for (TypeRef item : items) {
if (item instanceof VoidRef){addToVoidRefBounds((VoidRef)item);}
else if (item instanceof WildcardRef){addToWildcardRefBounds((WildcardRef)item);}
else if (item instanceof PrimitiveRef){addToPrimitiveRefBounds((PrimitiveRef)item);}
else if (item instanceof TypeParamRef){addToTypeParamRefBounds((TypeParamRef)item);}
else if (item instanceof ClassRef){addToClassRefBounds((ClassRef)item);}
} return (A)this;
}
public A removeFromBounds(TypeRef... items){
for (TypeRef item : items) {if (item instanceof VoidRef){removeFromVoidRefBounds((VoidRef)item);}
else if (item instanceof WildcardRef){removeFromWildcardRefBounds((WildcardRef)item);}
else if (item instanceof PrimitiveRef){removeFromPrimitiveRefBounds((PrimitiveRef)item);}
else if (item instanceof TypeParamRef){removeFromTypeParamRefBounds((TypeParamRef)item);}
else if (item instanceof ClassRef){removeFromClassRefBounds((ClassRef)item);}
} return (A)this;
}
public A removeAllFromBounds(Collection<TypeRef> items){
for (TypeRef item : items) {if (item instanceof VoidRef){removeFromVoidRefBounds((VoidRef)item);}
else if (item instanceof WildcardRef){removeFromWildcardRefBounds((WildcardRef)item);}
else if (item instanceof PrimitiveRef){removeFromPrimitiveRefBounds((PrimitiveRef)item);}
else if (item instanceof TypeParamRef){removeFromTypeParamRefBounds((TypeParamRef)item);}
else if (item instanceof ClassRef){removeFromClassRefBounds((ClassRef)item);}
} return (A)this;
}
/**
* This method has been deprecated, please use method buildBounds instead.
*/
@Deprecated public List<TypeRef> getBounds(){
return build(bounds);
}
public List<TypeRef> buildBounds(){
return build(bounds);
}
public TypeRef buildBound(int index){
return this.bounds.get(index).build();
}
public TypeRef buildFirstBound(){
return this.bounds.get(0).build();
}
public TypeRef buildLastBound(){
return this.bounds.get(bounds.size() - 1).build();
}
public TypeRef buildMatchingBound(Predicate<Builder<? extends TypeRef>> predicate){
for (Builder<? extends TypeRef> item: bounds) { if(predicate.apply(item)){return item.build();} } return null;
}
public A withBounds(List<TypeRef> bounds){
_visitables.removeAll(this.bounds);
this.bounds.clear();
if (bounds != null) {for (TypeRef item : bounds){this.addToBounds(item);}} return (A) this;
}
public A withBounds(TypeRef... bounds){
this.bounds.clear(); if (bounds != null) {for (TypeRef item :bounds){ this.addToBounds(item);}} return (A) this;
}
public Boolean hasBounds(){
return bounds!= null && !bounds.isEmpty();
}
public A addToVoidRefBounds(int index,VoidRef item){
VoidRefBuilder builder = new VoidRefBuilder(item);_visitables.add(builder);this.bounds.add(builder); return (A)this;
}
public A setToVoidRefBounds(int index,VoidRef item){
VoidRefBuilder builder = new VoidRefBuilder(item);_visitables.add(builder);this.bounds.add(builder); return (A)this;
}
public A addToVoidRefBounds(VoidRef... items){
for (VoidRef item : items) {VoidRefBuilder builder = new VoidRefBuilder(item);_visitables.add(builder);this.bounds.add(builder);} return (A)this;
}
public A addAllToVoidRefBounds(Collection<VoidRef> items){
for (VoidRef item : items) {VoidRefBuilder builder = new VoidRefBuilder(item);_visitables.add(builder);this.bounds.add(builder);} return (A)this;
}
public A removeFromVoidRefBounds(VoidRef... items){
for (VoidRef item : items) {VoidRefBuilder builder = new VoidRefBuilder(item);_visitables.remove(builder);this.bounds.remove(builder);} return (A)this;
}
public A removeAllFromVoidRefBounds(Collection<VoidRef> items){
for (VoidRef item : items) {VoidRefBuilder builder = new VoidRefBuilder(item);_visitables.remove(builder);this.bounds.remove(builder);} return (A)this;
}
public VoidRefBoundsNested<A> addNewVoidRefBound(){
return new VoidRefBoundsNestedImpl();
}
public VoidRefBoundsNested<A> addNewVoidRefBoundLike(VoidRef item){
return new VoidRefBoundsNestedImpl(-1, item);
}
public A addToWildcardRefBounds(int index,WildcardRef item){
WildcardRefBuilder builder = new WildcardRefBuilder(item);_visitables.add(builder);this.bounds.add(builder); return (A)this;
}
public A setToWildcardRefBounds(int index,WildcardRef item){
WildcardRefBuilder builder = new WildcardRefBuilder(item);_visitables.add(builder);this.bounds.add(builder); return (A)this;
}
public A addToWildcardRefBounds(WildcardRef... items){
for (WildcardRef item : items) {WildcardRefBuilder builder = new WildcardRefBuilder(item);_visitables.add(builder);this.bounds.add(builder);} return (A)this;
}
public A addAllToWildcardRefBounds(Collection<WildcardRef> items){
for (WildcardRef item : items) {WildcardRefBuilder builder = new WildcardRefBuilder(item);_visitables.add(builder);this.bounds.add(builder);} return (A)this;
}
public A removeFromWildcardRefBounds(WildcardRef... items){
for (WildcardRef item : items) {WildcardRefBuilder builder = new WildcardRefBuilder(item);_visitables.remove(builder);this.bounds.remove(builder);} return (A)this;
}
public A removeAllFromWildcardRefBounds(Collection<WildcardRef> items){
for (WildcardRef item : items) {WildcardRefBuilder builder = new WildcardRefBuilder(item);_visitables.remove(builder);this.bounds.remove(builder);} return (A)this;
}
public WildcardRefBoundsNested<A> addNewWildcardRefBound(){
return new WildcardRefBoundsNestedImpl();
}
public WildcardRefBoundsNested<A> addNewWildcardRefBoundLike(WildcardRef item){
return new WildcardRefBoundsNestedImpl(-1, item);
}
public A addToPrimitiveRefBounds(int index,PrimitiveRef item){
PrimitiveRefBuilder builder = new PrimitiveRefBuilder(item);_visitables.add(builder);this.bounds.add(builder); return (A)this;
}
public A setToPrimitiveRefBounds(int index,PrimitiveRef item){
PrimitiveRefBuilder builder = new PrimitiveRefBuilder(item);_visitables.add(builder);this.bounds.add(builder); return (A)this;
}
public A addToPrimitiveRefBounds(PrimitiveRef... items){
for (PrimitiveRef item : items) {PrimitiveRefBuilder builder = new PrimitiveRefBuilder(item);_visitables.add(builder);this.bounds.add(builder);} return (A)this;
}
public A addAllToPrimitiveRefBounds(Collection<PrimitiveRef> items){
for (PrimitiveRef item : items) {PrimitiveRefBuilder builder = new PrimitiveRefBuilder(item);_visitables.add(builder);this.bounds.add(builder);} return (A)this;
}
public A removeFromPrimitiveRefBounds(PrimitiveRef... items){
for (PrimitiveRef item : items) {PrimitiveRefBuilder builder = new PrimitiveRefBuilder(item);_visitables.remove(builder);this.bounds.remove(builder);} return (A)this;
}
public A removeAllFromPrimitiveRefBounds(Collection<PrimitiveRef> items){
for (PrimitiveRef item : items) {PrimitiveRefBuilder builder = new PrimitiveRefBuilder(item);_visitables.remove(builder);this.bounds.remove(builder);} return (A)this;
}
public PrimitiveRefBoundsNested<A> addNewPrimitiveRefBound(){
return new PrimitiveRefBoundsNestedImpl();
}
public PrimitiveRefBoundsNested<A> addNewPrimitiveRefBoundLike(PrimitiveRef item){
return new PrimitiveRefBoundsNestedImpl(-1, item);
}
public A addToTypeParamRefBounds(int index,TypeParamRef item){
TypeParamRefBuilder builder = new TypeParamRefBuilder(item);_visitables.add(builder);this.bounds.add(builder); return (A)this;
}
public A setToTypeParamRefBounds(int index,TypeParamRef item){
TypeParamRefBuilder builder = new TypeParamRefBuilder(item);_visitables.add(builder);this.bounds.add(builder); return (A)this;
}
public A addToTypeParamRefBounds(TypeParamRef... items){
for (TypeParamRef item : items) {TypeParamRefBuilder builder = new TypeParamRefBuilder(item);_visitables.add(builder);this.bounds.add(builder);} return (A)this;
}
public A addAllToTypeParamRefBounds(Collection<TypeParamRef> items){
for (TypeParamRef item : items) {TypeParamRefBuilder builder = new TypeParamRefBuilder(item);_visitables.add(builder);this.bounds.add(builder);} return (A)this;
}
public A removeFromTypeParamRefBounds(TypeParamRef... items){
for (TypeParamRef item : items) {TypeParamRefBuilder builder = new TypeParamRefBuilder(item);_visitables.remove(builder);this.bounds.remove(builder);} return (A)this;
}
public A removeAllFromTypeParamRefBounds(Collection<TypeParamRef> items){
for (TypeParamRef item : items) {TypeParamRefBuilder builder = new TypeParamRefBuilder(item);_visitables.remove(builder);this.bounds.remove(builder);} return (A)this;
}
public TypeParamRefBoundsNested<A> addNewTypeParamRefBound(){
return new TypeParamRefBoundsNestedImpl();
}
public TypeParamRefBoundsNested<A> addNewTypeParamRefBoundLike(TypeParamRef item){
return new TypeParamRefBoundsNestedImpl(-1, item);
}
public A addToClassRefBounds(int index,ClassRef item){
ClassRefBuilder builder = new ClassRefBuilder(item);_visitables.add(builder);this.bounds.add(builder); return (A)this;
}
public A setToClassRefBounds(int index,ClassRef item){
ClassRefBuilder builder = new ClassRefBuilder(item);_visitables.add(builder);this.bounds.add(builder); return (A)this;
}
public A addToClassRefBounds(ClassRef... items){
for (ClassRef item : items) {ClassRefBuilder builder = new ClassRefBuilder(item);_visitables.add(builder);this.bounds.add(builder);} return (A)this;
}
public A addAllToClassRefBounds(Collection<ClassRef> items){
for (ClassRef item : items) {ClassRefBuilder builder = new ClassRefBuilder(item);_visitables.add(builder);this.bounds.add(builder);} return (A)this;
}
public A removeFromClassRefBounds(ClassRef... items){
for (ClassRef item : items) {ClassRefBuilder builder = new ClassRefBuilder(item);_visitables.remove(builder);this.bounds.remove(builder);} return (A)this;
}
public A removeAllFromClassRefBounds(Collection<ClassRef> items){
for (ClassRef item : items) {ClassRefBuilder builder = new ClassRefBuilder(item);_visitables.remove(builder);this.bounds.remove(builder);} return (A)this;
}
public ClassRefBoundsNested<A> addNewClassRefBound(){
return new ClassRefBoundsNestedImpl();
}
public ClassRefBoundsNested<A> addNewClassRefBoundLike(ClassRef item){
return new ClassRefBoundsNestedImpl(-1, item);
}
public boolean equals(Object o){
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
WildcardRefFluentImpl that = (WildcardRefFluentImpl) o;
if (bounds != null ? !bounds.equals(that.bounds) :that.bounds != null) return false;
return true;
}
public class VoidRefBoundsNestedImpl<N> extends VoidRefFluentImpl<VoidRefBoundsNested<N>> implements VoidRefBoundsNested<N>,Nested<N>{
private final VoidRefBuilder builder;
private final int index;
VoidRefBoundsNestedImpl(int index,VoidRef item){
this.index = index;
this.builder = new VoidRefBuilder(this, item);
}
VoidRefBoundsNestedImpl(){
this.index = -1;
this.builder = new VoidRefBuilder(this);
}
public N and(){
return (N) WildcardRefFluentImpl.this.addToVoidRefBounds(index, builder.build());
}
public N endVoidRefBound(){
return and();
}
}
public class WildcardRefBoundsNestedImpl<N> extends WildcardRefFluentImpl<WildcardRefBoundsNested<N>> implements WildcardRefBoundsNested<N>,Nested<N>{
private final WildcardRefBuilder builder;
private final int index;
WildcardRefBoundsNestedImpl(int index,WildcardRef item){
this.index = index;
this.builder = new WildcardRefBuilder(this, item);
}
WildcardRefBoundsNestedImpl(){
this.index = -1;
this.builder = new WildcardRefBuilder(this);
}
public N and(){
return (N) WildcardRefFluentImpl.this.addToWildcardRefBounds(index, builder.build());
}
public N endWildcardRefBound(){
return and();
}
}
public class PrimitiveRefBoundsNestedImpl<N> extends PrimitiveRefFluentImpl<PrimitiveRefBoundsNested<N>> implements PrimitiveRefBoundsNested<N>,Nested<N>{
private final PrimitiveRefBuilder builder;
private final int index;
PrimitiveRefBoundsNestedImpl(int index,PrimitiveRef item){
this.index = index;
this.builder = new PrimitiveRefBuilder(this, item);
}
PrimitiveRefBoundsNestedImpl(){
this.index = -1;
this.builder = new PrimitiveRefBuilder(this);
}
public N and(){
return (N) WildcardRefFluentImpl.this.addToPrimitiveRefBounds(index, builder.build());
}
public N endPrimitiveRefBound(){
return and();
}
}
public class TypeParamRefBoundsNestedImpl<N> extends TypeParamRefFluentImpl<TypeParamRefBoundsNested<N>> implements TypeParamRefBoundsNested<N>,Nested<N>{
private final TypeParamRefBuilder builder;
private final int index;
TypeParamRefBoundsNestedImpl(int index,TypeParamRef item){
this.index = index;
this.builder = new TypeParamRefBuilder(this, item);
}
TypeParamRefBoundsNestedImpl(){
this.index = -1;
this.builder = new TypeParamRefBuilder(this);
}
public N and(){
return (N) WildcardRefFluentImpl.this.addToTypeParamRefBounds(index, builder.build());
}
public N endTypeParamRefBound(){
return and();
}
}
public class ClassRefBoundsNestedImpl<N> extends ClassRefFluentImpl<ClassRefBoundsNested<N>> implements ClassRefBoundsNested<N>,Nested<N>{
private final ClassRefBuilder builder;
private final int index;
ClassRefBoundsNestedImpl(int index,ClassRef item){
this.index = index;
this.builder = new ClassRefBuilder(this, item);
}
ClassRefBoundsNestedImpl(){
this.index = -1;
this.builder = new ClassRefBuilder(this);
}
public N and(){
return (N) WildcardRefFluentImpl.this.addToClassRefBounds(index, builder.build());
}
public N endClassRefBound(){
return and();
}
}
}