001/** 002 * Copyright (c) 2011, The University of Southampton and the individual contributors. 003 * All rights reserved. 004 * 005 * Redistribution and use in source and binary forms, with or without modification, 006 * are permitted provided that the following conditions are met: 007 * 008 * * Redistributions of source code must retain the above copyright notice, 009 * this list of conditions and the following disclaimer. 010 * 011 * * Redistributions in binary form must reproduce the above copyright notice, 012 * this list of conditions and the following disclaimer in the documentation 013 * and/or other materials provided with the distribution. 014 * 015 * * Neither the name of the University of Southampton nor the names of its 016 * contributors may be used to endorse or promote products derived from this 017 * software without specific prior written permission. 018 * 019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 020 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 021 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 022 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 023 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 026 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 028 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 029 */ 030package org.openimaj.math.geometry.point; 031 032import java.io.DataInput; 033import java.io.DataOutput; 034import java.io.IOException; 035import java.io.PrintWriter; 036import java.util.Scanner; 037 038/** 039 * A concrete implementation of a {@link Coordinate} that has an associated 040 * payload. 041 * 042 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk) 043 * 044 * @param <T> 045 * Type of underlying coordinate 046 * @param <O> 047 * Type of payload data 048 */ 049public class PayloadCoordinate<T extends Coordinate, O> implements Coordinate { 050 051 private T coord; 052 private O payload; 053 054 /** 055 * Construct with coordinate and payload. 056 * 057 * @param coord 058 * The coordinate. 059 * @param payload 060 * The payload. 061 */ 062 public PayloadCoordinate(T coord, O payload) { 063 this.coord = coord; 064 this.setPayload(payload); 065 } 066 067 @Override 068 public void readASCII(Scanner in) throws IOException { 069 coord.readASCII(in); 070 } 071 072 @Override 073 public String asciiHeader() { 074 return coord.asciiHeader(); 075 } 076 077 @Override 078 public void readBinary(DataInput in) throws IOException { 079 coord.readBinary(in); 080 } 081 082 @Override 083 public byte[] binaryHeader() { 084 return coord.binaryHeader(); 085 } 086 087 @Override 088 public void writeASCII(PrintWriter out) throws IOException { 089 coord.writeASCII(out); 090 } 091 092 @Override 093 public void writeBinary(DataOutput out) throws IOException { 094 coord.writeBinary(out); 095 } 096 097 @Override 098 public Number getOrdinate(int dimension) { 099 return coord.getOrdinate(dimension); 100 } 101 102 @Override 103 public int getDimensions() { 104 return coord.getDimensions(); 105 } 106 107 /** 108 * Set the payload. 109 * 110 * @param payload 111 * The payload 112 */ 113 public void setPayload(O payload) { 114 this.payload = payload; 115 } 116 117 /** 118 * @return The payload. 119 */ 120 public O getPayload() { 121 return payload; 122 } 123 124 /** 125 * Create a {@link PayloadCoordinate}. 126 * 127 * @param <T> 128 * The coordinate type. 129 * @param <O> 130 * The payload type. 131 * @param coord 132 * The coordinate. 133 * @param payload 134 * The payload. 135 * @return the newly created {@link PayloadCoordinate}. 136 */ 137 public static <T extends Coordinate, O> PayloadCoordinate<T, O> payload(T coord, O payload) { 138 return new PayloadCoordinate<T, O>(coord, payload); 139 } 140 141 @Override 142 public void setOrdinate(int dimension, Number value) { 143 coord.setOrdinate(dimension, value); 144 } 145}