org.jboss.classfilewriter.code.TableSwitchBuilder Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of weld-servlet-shaded Show documentation
Show all versions of weld-servlet-shaded Show documentation
This jar bundles all the bits of Weld and CDI required for running in a Servlet container.
/*
* JBoss, Home of Professional Open Source.
*
* Copyright 2012 Red Hat, Inc.
*
* 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 org.jboss.classfilewriter.code;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
/**
* builder class used to build a tableswitch statement.
*
* @author Stuart Douglas
*/
public class TableSwitchBuilder {
private final CodeLocation defaultLocation;
private final AtomicReference defaultBranchEnd;
private final List values = new ArrayList();
private final int low;
private final int high;
/**
* Builds a lookup switch statement with no specified default location.
*
* When the lookup switch is added to the code attribute a {@link org.jboss.classfilewriter.code.BranchEnd} will be returned that can be used to
* set the location.
* @param low
* @param high
*/
public TableSwitchBuilder(final int low, final int high) {
this.low = low;
this.high = high;
defaultBranchEnd = new AtomicReference();
defaultLocation = null;
}
/**
* Builds a lookup switch statement, specifying the default location
* @param defaultLocation The default location
* @param low
* @param high
*/
public TableSwitchBuilder(final CodeLocation defaultLocation, final int low, final int high) {
this.defaultLocation = defaultLocation;
this.low = low;
this.high = high;
defaultBranchEnd = null;
}
/**
* Adds a value to the table that is at a location yet to be written.
*
* After this lookup switch has been written then the BranchEnd can be retrieved
* from the returned reference.
*
* @return A reference to the BranchEnd that will be created.
*/
public AtomicReference add() {
final AtomicReference end = new AtomicReference();
ValuePair vp = new ValuePair(end);
values.add(vp);
return end;
}
/**
* Adds a value to the table
*
*
*/
public TableSwitchBuilder add( final CodeLocation location) {
values.add(new ValuePair(location));
return this;
}
public CodeLocation getDefaultLocation() {
return defaultLocation;
}
public AtomicReference getDefaultBranchEnd() {
return defaultBranchEnd;
}
public List getValues() {
return Collections.unmodifiableList(values);
}
public int getLow() {
return low;
}
public int getHigh() {
return high;
}
public static class ValuePair {
private final CodeLocation location;
private final AtomicReference branchEnd;
public ValuePair(final AtomicReference branchEnd) {
this.location = null;
this.branchEnd = branchEnd;
}
public ValuePair(final CodeLocation location) {
this.location = location;
this.branchEnd = null;
}
public CodeLocation getLocation() {
return location;
}
public AtomicReference getBranchEnd() {
return branchEnd;
}
}
}