01: /*
02: * <copyright>
03: *
04: * Copyright 2004 BBNT Solutions, LLC
05: * under sponsorship of the Defense Advanced Research Projects
06: * Agency (DARPA).
07: *
08: * You can redistribute this software and/or modify it under the
09: * terms of the Cougaar Open Source License as published on the
10: * Cougaar Open Source Website (www.cougaar.org).
11: *
12: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
13: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
14: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
15: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
16: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
17: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
18: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
22: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23: *
24: * </copyright>
25: */
26:
27: package org.cougaar.util;
28:
29: import java.util.*;
30:
31: /**
32: * A "memoization" utility - as long as the specified condition object
33: * doesn't change, then the result doesn't change.
34: **/
35: public class Memo {
36: private static Object UNDEFINED = new Object();
37:
38: private final Memo.Function function;
39: private Object param = UNDEFINED;
40: private Object result = UNDEFINED;
41:
42: private Memo(Memo.Function f) {
43: this .function = f;
44: }
45:
46: /** Factory method for a Memo **/
47: public static Memo get(Memo.Function f) {
48: return new Memo(f);
49: }
50:
51: /** Compute the result of applying the Memo's function to the parameter.
52: * The function might not actually be run if the parameter's value is ==
53: * the previous value (if any).
54: **/
55: public synchronized Object eval(Object p) {
56: if (param != p) { // catches UNDEFINED, too
57: result = function.eval(p);
58: param = p;
59: }
60: return result;
61: }
62:
63: /** Similar to #eval(Object), except will return the result of applying
64: * the function to the parameter IFF the function was actually called.
65: * This allows the caller to easily abort a sequence of events if
66: * the previous computation is still in force.
67: * @note Use of this method implies that the function should never return null
68: * as a valid result or it will be impossible to distinguish between that case
69: * and a "not new" case.
70: **/
71: public synchronized Object evalIfNew(Object p) {
72: if (param != p) { // catches UNDEFINED, too
73: result = function.eval(p);
74: param = p;
75: return result;
76: } else {
77: return null;
78: }
79: }
80:
81: public static interface Function {
82: Object eval(Object x);
83: }
84: }
|