package org.libspark.common.support { import flash.utils.ByteArray; import flash.utils.Dictionary; import org.libspark.common.store.IWritableStore; import org.libspark.common.store.IStorable; import org.libspark.common.store.DictionaryedWritableStore; /** * IStorable を実装したクラスに対して IComparable#isEqual メソッドの実装をサポートします. */ public class EqualSupport implements IWritableStore { public function EqualSupport() { } private var _collected:Dictionary; private var _result:Boolean; protected function get collected():Dictionary { return _collected; } protected function set collected(value:Dictionary):void { _collected = value; } public function get result():Boolean { return _result; } protected function setResult(value:Boolean):void { _result = value; } /** * 'a' と 'b' の全てのフィールドの値/参照が同一かを調べて結果を返します. * * Require: a != null * Require: b != null */ public function compare(a:IStorable, b:IStorable):void { setResult(true); var collector:DictionaryedWritableStore = new DictionaryedWritableStore(); b.store(collector); collected = collector.store; a.store(this); collected = null; } public function writeArray(key:String, value:Array):void { if (!(key in collected) || (value != collected[key])) { setResult(false); } } public function writeBoolean(key:String, value:Boolean):void { if (!(key in collected) || (value != collected[key])) { setResult(false); } } public function writeByteArray(key:String, value:ByteArray):void { if (!(key in collected) || (value != collected[key])) { setResult(false); } } public function writeDictionary(key:String, value:Dictionary):void { if (!(key in collected) || (value != collected[key])) { setResult(false); } } public function writeInt(key:String, value:int):void { if (!(key in collected) || (value != collected[key])) { setResult(false); } } public function writeNumber(key:String, value:Number):void { if (!(key in collected) || (value != collected[key])) { setResult(false); } } public function writeStorable(key:String, value:IStorable):void { if (!(key in collected) || (value != collected[key])) { setResult(false); } } public function writeString(key:String, value:String):void { if (!(key in collected) || (value != collected[key])) { setResult(false); } } public function writeUint(key:String, value:uint):void { if (!(key in collected) || (value != collected[key])) { setResult(false); } } } }