So, Flash CS4's internal compiler chokes on public class that implements an interface, when it's followed by faux-inner-classes after the main package declaration. This is the only workaround I can think of; pray god Adobe fixes their stuff soon and we can revert this irritating patch.

git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5561 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Par Winzell
2008-11-19 15:14:29 +00:00
parent 8c1faeb2a3
commit 5d769cbf5f
3 changed files with 143 additions and 85 deletions
+15 -85
View File
@@ -1,4 +1,4 @@
//
//
// $Id$
//
// Narya library - tools for developing networked games
@@ -96,7 +96,7 @@ public class HashMap
var hkey :Hashable = keyFor(key);
var hash :int = hkey.hashCode();
var index :int = indexFor(hash);
var e :Entry = (_entries[index] as Entry);
var e :HashMap_Entry = (_entries[index] as HashMap_Entry);
while (e != null) {
if (e.hash == hash && e.key.equals(hkey)) {
return e.value;
@@ -138,8 +138,8 @@ public class HashMap
var hkey :Hashable = keyFor(key);
var hash :int = hkey.hashCode();
var index :int = indexFor(hash);
var firstEntry :Entry = (_entries[index] as Entry);
for (var e :Entry = firstEntry; e != null; e = e.next) {
var firstEntry :HashMap_Entry = (_entries[index] as HashMap_Entry);
for (var e :HashMap_Entry = firstEntry; e != null; e = e.next) {
if (e.hash == hash && e.key.equals(hkey)) {
oldValue = e.value;
e.value = value;
@@ -147,7 +147,7 @@ public class HashMap
}
}
_entries[index] = new Entry(hash, hkey, value, firstEntry);
_entries[index] = new HashMap_Entry(hash, hkey, value, firstEntry);
_entriesSize++;
// check to see if we should grow the map
if (_entriesSize > _entries.length * _loadFactor) {
@@ -180,11 +180,11 @@ public class HashMap
var hkey :Hashable = keyFor(key);
var hash :int = hkey.hashCode();
var index :int = indexFor(hash);
var prev :Entry = (_entries[index] as Entry);
var e :Entry = prev;
var prev :HashMap_Entry = (_entries[index] as HashMap_Entry);
var e :HashMap_Entry = prev;
while (e != null) {
var next :Entry = e.next;
var next :HashMap_Entry = e.next;
if (e.hash == hash && e.key.equals(hkey)) {
if (prev == e) {
_entries[index] = next;
@@ -227,7 +227,7 @@ public class HashMap
// get the more complex keys
if (_entries != null) {
for (var ii :int = _entries.length - 1; ii >= 0; ii--) {
for (var e :Entry = (_entries[ii] as Entry); e != null;
for (var e :HashMap_Entry = (_entries[ii] as HashMap_Entry); e != null;
e = e.next) {
keys.push(e.getOriginalKey());
}
@@ -252,7 +252,7 @@ public class HashMap
// get the more complex properties
if (_entries != null) {
for (var ii :int = _entries.length - 1; ii >= 0; ii--) {
for (var e :Entry = (_entries[ii] as Entry); e != null;
for (var e :HashMap_Entry = (_entries[ii] as HashMap_Entry); e != null;
e = e.next) {
vals.push(e.value);
}
@@ -273,7 +273,7 @@ public class HashMap
if (_entries != null) {
for (var ii :int = _entries.length - 1; ii >= 0; ii--) {
for (var e :Entry = (_entries[ii] as Entry); e != null;
for (var e :HashMap_Entry = (_entries[ii] as HashMap_Entry); e != null;
e = e.next) {
fn(e.getOriginalKey(), e.value);
}
@@ -295,7 +295,7 @@ public class HashMap
"for HashMap created without hashing functions.");
} else {
return new KeyWrapper(key, _equalsFn, _hashFn);
return new HashMap_KeyWrapper(key, _equalsFn, _hashFn);
}
}
@@ -332,11 +332,11 @@ public class HashMap
// place all the old entries in the new map
for (var ii :int = 0; ii < oldEntries.length; ii++) {
var e :Entry = (oldEntries[ii] as Entry);
var e :HashMap_Entry = (oldEntries[ii] as HashMap_Entry);
while (e != null) {
var next :Entry = e.next;
var next :HashMap_Entry = e.next;
var index :int = indexFor(e.hash);
e.next = (_entries[index] as Entry);
e.next = (_entries[index] as HashMap_Entry);
_entries[index] = e;
e = next;
}
@@ -370,73 +370,3 @@ public class HashMap
} // end: package com.threerings.util
import com.threerings.util.Hashable;
class Entry
{
public var key :Hashable;
public var value :Object;
public var hash :int;
public var next :Entry;
public function Entry (hash :int, key :Hashable, value :Object, next :Entry)
{
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
/**
* Get the original key used to store this entry.
*/
public function getOriginalKey () :Object
{
if (key is KeyWrapper) {
return (key as KeyWrapper).key;
}
return key;
}
}
class KeyWrapper
implements Hashable
{
public var key :Object;
public function KeyWrapper (
key :Object, equalsFn :Function, hashFn :Function)
{
this.key = key;
_equalsFn = equalsFn;
var hashValue :* = hashFn(key);
if (hashValue is String) {
var uid :String = (hashValue as String);
// examine at most 32 characters of the string
var inc :int = int(Math.max(1, Math.ceil(uid.length / 32)));
for (var ii :int = 0; ii < uid.length; ii += inc) {
_hash = (_hash << 1) ^ int(uid.charCodeAt(ii));
}
} else {
_hash = int(hashValue);
}
}
// documentation inherited from interface Hashable
public function equals (other :Object) :Boolean
{
return (other is KeyWrapper) &&
Boolean(_equalsFn(key, (other as KeyWrapper).key));
}
// documentation inherited from interface Hashable
public function hashCode () :int
{
return _hash;
}
protected var _key :Object;
protected var _hash :int;
protected var _equalsFn :Function;
}
@@ -0,0 +1,57 @@
//
// $Id: $
//
// Narya library - tools for developing networked games
// Copyright (C) 2002-2007 Three Rings Design, Inc., All Rights Reserved
// http://www.threerings.net/code/narya/
//
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package com.threerings.util {
import com.threerings.util.Hashable;
/**
* A key/value pair in a HashMap. This is really an internal class to HashMap, and when
* Flash CS4 is fixed, it will go nestle back into HashMap.as's luxurious folds.
*/
public class HashMap_Entry
{
public var key :Hashable;
public var value :Object;
public var hash :int;
public var next :HashMap_Entry;
public function HashMap_Entry (hash :int, key :Hashable, value :Object, next :HashMap_Entry)
{
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
/**
* Get the original key used to store this entry.
*/
public function getOriginalKey () :Object
{
if (key is HashMap_KeyWrapper) {
return (key as HashMap_KeyWrapper).key;
}
return key;
}
}
}
@@ -0,0 +1,71 @@
//
// $Id: $
//
// Narya library - tools for developing networked games
// Copyright (C) 2002-2007 Three Rings Design, Inc., All Rights Reserved
// http://www.threerings.net/code/narya/
//
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package com.threerings.util {
import com.threerings.util.Hashable;
/**
* A wrapped key object HashMap. This is really an internal class to HashMap, and when
* Flash CS4 is fixed, it will go nestle back into HashMap.as's luxurious folds.
*/
public class HashMap_KeyWrapper
implements Hashable
{
public var key :Object;
public function HashMap_KeyWrapper (
key :Object, equalsFn :Function, hashFn :Function)
{
this.key = key;
_equalsFn = equalsFn;
var hashValue :* = hashFn(key);
if (hashValue is String) {
var uid :String = (hashValue as String);
// examine at most 32 characters of the string
var inc :int = int(Math.max(1, Math.ceil(uid.length / 32)));
for (var ii :int = 0; ii < uid.length; ii += inc) {
_hash = (_hash << 1) ^ int(uid.charCodeAt(ii));
}
} else {
_hash = int(hashValue);
}
}
// documentation inherited from interface Hashable
public function equals (other :Object) :Boolean
{
return (other is HashMap_KeyWrapper) &&
Boolean(_equalsFn(key, (other as HashMap_KeyWrapper).key));
}
// documentation inherited from interface Hashable
public function hashCode () :int
{
return _hash;
}
protected var _key :Object;
protected var _hash :int;
protected var _equalsFn :Function;
}
}