View Javadoc

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  }