You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
311 lines
11 KiB
311 lines
11 KiB
/** |
|
* Aliases allow users to define human-readable and easier to use |
|
* "synonyms" to some symbol sequences (mainly names of UnrealScript classes). |
|
* This is an interface class that can be implemented in various different |
|
* ways. |
|
* Several `AliasSource`s are supposed to exist separately, each storing |
|
* aliases of particular kind: for weapon, zeds, colors, etc.. |
|
* Copyright 2022 Anton Tarasenko |
|
*------------------------------------------------------------------------------ |
|
* This file is part of Acedia. |
|
* |
|
* Acedia is free software: you can redistribute it and/or modify |
|
* it under the terms of the GNU General Public License as published by |
|
* the Free Software Foundation, version 3 of the License, or |
|
* (at your option) any later version. |
|
* |
|
* Acedia 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 General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with Acedia. If not, see <https://www.gnu.org/licenses/>. |
|
*/ |
|
class BaseAliasSource extends AcediaObject |
|
abstract; |
|
|
|
/** |
|
* # `AliasSource` |
|
* |
|
* Interface for any alias source instance that includes basic methods for |
|
* alias lookup and adding/removal. |
|
* |
|
* ## Aliases |
|
* |
|
* Aliases in Acedia are usually defined as either `$<alias_name>`. |
|
* `<alias_name>` can only contain ASCII latin letters and digits. |
|
* `<alias_name>` is meant to define a human-readable name for something |
|
* (e.g. "m14" for `KFMod.M14EBRBattleRifle`). |
|
* Aliases are *case-insensitive*. |
|
* '$' prefix is used to emphasize that what user is specifying is, |
|
* in fact, an alias and it *is not* actually important for aliases feature |
|
* and API: only `<alias_name>` is used. However, for convenience's sake, |
|
* `AliasesAPI` usually recognizes aliases both with and without '$' prefix. |
|
* Alias sources (classes derived from `BaseAliasSource`), however should only |
|
* handle resolving `<alias_name>`, treating '$' prefix as a mistake in alias |
|
* parameter. |
|
* |
|
* ## Implementation |
|
* |
|
* As far as implementation goes, it's up to you how your own child alias |
|
* source class is configured to obtain its aliases, but `Aliases_Feature` |
|
* should only create a single instance for every source class (although |
|
* nothing can prevent other mods from creating more instances, so we cannot |
|
* give any guarantees). |
|
* Methods that add or remove aliases are allowed to fail for whatever |
|
* reason is valid for your source's case (it might forbid adding aliases |
|
* at all), as long as they return `false`. |
|
* Although all built-in aliases are storing case-insensitive values, |
|
* `BaseAliasSource` does not demand that and allows to configure this behavior |
|
* via `AreValuesCaseSensitive()`. This is important for `GetAliases()` method |
|
* that returns all aliases referring to a given value. |
|
*/ |
|
|
|
/** |
|
* Returns whether caller alias source class stores case-sensitive values. |
|
* |
|
* This information is necessary for organizing lookup of aliases by |
|
* a given value. Aliases themselves are always case-insensitive. |
|
* |
|
* This method should not change returned value for any fixed class. |
|
* |
|
* @return `true` if stored values are case-sensitive and `false` if they are |
|
* case-insensitive. |
|
*/ |
|
public static function bool AreValuesCaseSensitive(); |
|
|
|
/** |
|
* Returns all aliases that are stored in the caller source/ |
|
* |
|
* @return Array of all aliases inside the caller alias source. All `Text` |
|
* references are guaranteed to not be `none` or duplicated. |
|
*/ |
|
public function array<Text> GetAllAliases(); |
|
|
|
/** |
|
* Returns all aliases that are stored in the caller source/ |
|
* |
|
* @return Array of all aliases inside the caller alias source. All `Text` |
|
* references are guaranteed to not be `none` or duplicated. |
|
*/ |
|
public function array<string> GetAllAliases_S() |
|
{ |
|
local int i; |
|
local array<Text> resultWithTexts; |
|
local array<string> result; |
|
|
|
resultWithTexts = GetAllAliases(); |
|
for (i = 0; i < resultWithTexts.length; i += 1) { |
|
result[result.length] = resultWithTexts[i].ToString(); |
|
} |
|
_.memory.FreeMany(resultWithTexts); |
|
return result; |
|
} |
|
|
|
/** |
|
* Returns all aliases that represent given value `value`. |
|
* |
|
* @param value Value for which to return all its aliases. |
|
* Whether it is treated as case-sensitive is decided by |
|
* `AreValuesCaseSensitive()` method, but all default alias sources are |
|
* case-insensitive. |
|
* @return Array of all aliases that refer to the given `value` inside |
|
* the caller alias source. All `Text` references are guaranteed to not be |
|
* `none` or duplicated. |
|
*/ |
|
public function array<Text> GetAliases(BaseText value); |
|
|
|
/** |
|
* Returns all aliases that represent given value `value`. |
|
* |
|
* @param value Value for which to return all its aliases. |
|
* Whether it is treated as case-sensitive is decided by |
|
* `AreValuesCaseSensitive()` method, but all default alias sources are |
|
* case-insensitive. |
|
* @return Array of all aliases that refer to the given `value` inside |
|
* the caller alias source. All `string` references are guaranteed to not |
|
* be duplicated. |
|
*/ |
|
public function array<string> GetAliases_S(string value) |
|
{ |
|
local int i; |
|
local Text valueAsText; |
|
local array<Text> resultWithTexts; |
|
local array<string> result; |
|
|
|
valueAsText = _.text.FromString(value); |
|
resultWithTexts = GetAliases(valueAsText); |
|
_.memory.Free(valueAsText); |
|
for (i = 0; i < resultWithTexts.length; i += 1) { |
|
result[result.length] = resultWithTexts[i].ToString(); |
|
} |
|
_.memory.FreeMany(resultWithTexts); |
|
return result; |
|
} |
|
|
|
/** |
|
* Checks if given alias is present in caller `AliasSource`. |
|
* |
|
* NOTE: having '$' prefix is considered to be invalid for `alias` by this |
|
* method. |
|
* |
|
* @param alias Alias to check, case-insensitive. |
|
* @return `true` if present, `false` otherwise. |
|
*/ |
|
public function bool HasAlias(BaseText alias); |
|
|
|
/** |
|
* Checks if given alias is present in caller `AliasSource`. |
|
* |
|
* NOTE: having '$' prefix is considered to be invalid for `alias` by this |
|
* method. |
|
* |
|
* @param alias Alias to check, case-insensitive. |
|
* @return `true` if present, `false` otherwise. |
|
*/ |
|
public function bool HasAlias_S(string alias) |
|
{ |
|
local bool result; |
|
local Text aliasAsText; |
|
|
|
aliasAsText = _.text.FromString(alias); |
|
result = HasAlias(aliasAsText); |
|
_.memory.Free(aliasAsText); |
|
return result; |
|
} |
|
|
|
/** |
|
* Returns value stored for the given alias in caller `AliasSource` |
|
* (as well as it's `Aliases` objects). |
|
* |
|
* NOTE: having '$' prefix is considered to be invalid for `alias` by this |
|
* method. |
|
* |
|
* @param alias Alias, for which method will attempt to return |
|
* a value. Case-insensitive. If given `alias` starts with "$" character - |
|
* that character will be removed before resolving that alias. |
|
* @param copyOnFailure Whether method should return copy of original |
|
* `alias` value in case caller source did not have any records |
|
* corresponding to `alias`. |
|
* @return If look up was successful - value, associated with the given |
|
* alias `alias`. If lookup was unsuccessful, it depends on `copyOnFailure` |
|
* flag: `copyOnFailure == false` means method will return `none` |
|
* and `copyOnFailure == true` means method will return `alias.Copy()`. |
|
* If `alias == none` method always returns `none`. |
|
*/ |
|
public function Text Resolve(BaseText alias, optional bool copyOnFailure); |
|
|
|
/** |
|
* Returns value stored for the given alias in caller `AliasSource` |
|
* (as well as it's `Aliases` objects). |
|
* |
|
* NOTE: having '$' prefix is considered to be invalid for `alias` by this |
|
* method. |
|
* |
|
* @param alias Alias, for which method will attempt to return |
|
* a value. Case-insensitive. If given `alias` starts with "$" character - |
|
* that character will be removed before resolving that alias. |
|
* @param copyOnFailure Whether method should return copy of original |
|
* `alias` value in case caller source did not have any records |
|
* corresponding to `alias`. |
|
* @return If look up was successful - value, associated with the given |
|
* alias `alias`. If lookup was unsuccessful, it depends on `copyOnFailure` |
|
* flag: `copyOnFailure == false` means method will return empty `string` |
|
* and `copyOnFailure == true` means method will return `alias`. |
|
*/ |
|
public function string Resolve_S( |
|
string alias, |
|
optional bool copyOnFailure) |
|
{ |
|
local Text resultAsText; |
|
local Text aliasAsText; |
|
|
|
aliasAsText = _.text.FromString(alias); |
|
resultAsText = Resolve(aliasAsText, copyOnFailure); |
|
return _.text.IntoString(resultAsText); |
|
} |
|
|
|
/** |
|
* Adds another alias to the caller `AliasSource`. |
|
* If alias with the same name as `aliasToAdd` already exists - method |
|
* overwrites it. |
|
* |
|
* Can fail iff `aliasToAdd` is an invalid alias or `aliasValue == none`. |
|
* |
|
* NOTE: having '$' prefix is considered to be invalid for `alias` by this |
|
* method. |
|
* |
|
* @param aliasToAdd Alias that you want to add to caller source. |
|
* Alias names are case-insensitive. |
|
* @param aliasValue Intended value of this alias. |
|
* @return `true` if alias was added and `false` otherwise (alias was invalid). |
|
*/ |
|
public function bool AddAlias(BaseText aliasToAdd, BaseText aliasValue); |
|
|
|
/** |
|
* Adds another alias to the caller `AliasSource`. |
|
* If alias with the same name as `aliasToAdd` already exists, - |
|
* method overwrites it. |
|
* |
|
* Can fail iff `aliasToAdd` is an invalid alias. |
|
* |
|
* NOTE: having '$' prefix is considered to be invalid for `alias` by this |
|
* method. |
|
* |
|
* @param aliasToAdd Alias that you want to add to caller source. |
|
* Alias names are case-insensitive. |
|
* @param aliasValue Intended value of this alias. |
|
* @return `true` if alias was added and `false` otherwise (alias was invalid). |
|
*/ |
|
public function bool AddAlias_S(string aliasToAdd, string aliasValue) |
|
{ |
|
local bool result; |
|
local Text aliasAsText, valueAsText; |
|
|
|
aliasAsText = _.text.FromString(aliasToAdd); |
|
valueAsText = _.text.FromString(aliasValue); |
|
result = AddAlias(aliasAsText, valueAsText); |
|
_.memory.Free(aliasAsText); |
|
_.memory.Free(valueAsText); |
|
return result; |
|
} |
|
|
|
/** |
|
* Removes alias (all records with it, in case of duplicates) from |
|
* the caller `AliasSource`. |
|
* |
|
* NOTE: having '$' prefix is considered to be invalid for `alias` by this |
|
* method. |
|
* |
|
* @param aliasToRemove Alias that you want to remove from caller source. |
|
* @return `true` if an alias was present in the source and was deleted and |
|
* `false` if there was no specified alias in the first place. |
|
*/ |
|
public function bool RemoveAlias(BaseText aliasToRemove); |
|
|
|
/** |
|
* Removes alias (all records with it, in case of duplicates) from |
|
* the caller `AliasSource`. |
|
* |
|
* NOTE: having '$' prefix is considered to be invalid for `alias` by this |
|
* method. |
|
* |
|
* @param aliasToRemove Alias that you want to remove from caller source. |
|
* @return `true` if an alias was present in the source and was deleted and |
|
* `false` if there was no specified alias in the first place. |
|
*/ |
|
public function bool RemoveAlias_S(string aliasToRemove) |
|
{ |
|
local bool result; |
|
local Text aliasAsText; |
|
|
|
aliasAsText = _.text.FromString(aliasToRemove); |
|
result = RemoveAlias(aliasAsText); |
|
_.memory.Free(aliasAsText); |
|
return result; |
|
} |
|
|
|
defaultproperties |
|
{ |
|
} |