1 /* 2 * Entreri, an entity-component framework in Java 3 * 4 * Copyright (c) 2013, Michael Ludwig 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without modification, 8 * are permitted provided that the following conditions are met: 9 * 10 * Redistributions of source code must retain the above copyright notice, 11 * this list of conditions and the following disclaimer. 12 * Redistributions in binary form must reproduce the above copyright notice, 13 * this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 20 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 23 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 package com.lhkbob.entreri.property; 28 29 /** 30 * ShareableProperty designates a special type of property that can mutate a shared 31 * instance to a specific component's value, instead of returning internal references. 32 * Often, shareable properties are capable of actually unpacking the type into primitive 33 * arrays and restoring the value into the shared instance for improved cache coherence. 34 * <p/> 35 * Because simple primitives cannot be shared, ShareableProperty declares the required 36 * methods using generics. 37 * 38 * @param <T> The type stored by the property 39 * 40 * @author Michael Ludwig 41 */ 42 public interface ShareableProperty<T> extends Property { 43 /** 44 * Create a new instance of type T for use by components that need a shareable 45 * instance to pass into {@link #get(int, Object)}. 46 * 47 * @return A new instance of type T 48 */ 49 public T createShareableInstance(); 50 51 /** 52 * Get the property value at <var>index</var>, but instead of returning a new instance 53 * or the value, the <var>result</var> parameter is mutated to equal the property 54 * value. It can be assumed the instance was previously created by a call to {@link 55 * #createShareableInstance()}. 56 * 57 * @param index The index to access 58 * @param result The instance of T to modify 59 */ 60 public void get(int index, T result); 61 }