@itwin/core-bentley
Version:
Bentley JavaScript core components
330 lines • 18 kB
TypeScript
/** @packageDocumentation
* @module Ids
*/
/** A string containing a well-formed string representation of an [Id64]($core-bentley).
* See [Working with Ids]($docs/learning/common/Id64.md).
* @public
*/
export type Id64String = string;
/** A string containing a well-formed string representation of a [Guid]($core-bentley).
* @public
*/
export type GuidString = string;
/** A set of [[Id64String]]s.
* @public
*/
export type Id64Set = Set<Id64String>;
/** An array of [[Id64String]]s.
* @public
*/
export type Id64Array = Id64String[];
/** Used as an argument to a function that can accept one or more [[Id64String]]s.
* @public
*/
export type Id64Arg = Id64String | Id64Set | Id64Array;
/**
* The Id64 namespace provides facilities for working with 64-bit identifiers. These Ids are stored as 64-bit integers inside an [[IModelDb]], but must be represented
* as strings in JavaScript because JavaScript does not intrinsically support 64-bit integers.
*
* The [[Id64String]] type alias is used to indicate function arguments, return types, and variables which are known to contain a well-formed representation of a 64-bit Id.
*
* See [Working with Ids]($docs/learning/common/Id64.md) for a detailed description and code examples.
* @public
*/
export declare namespace Id64 {
/** Extract the "local" Id portion of an Id64String, contained in the lower 40 bits of the 64-bit value. */
function getLocalId(id: Id64String): number;
/** Extract the briefcase Id portion of an Id64String, contained in the upper 24 bits of the 64-bit value. */
function getBriefcaseId(id: Id64String): number;
/** Create an Id64String from its JSON representation.
* @param prop The JSON representation of an Id.
* @returns A well-formed Id string.
* @note if the input is undefined, the result is "0", indicating an invalid Id.
* @note if the input is not undefined, the result is the same as that of [[Id64.fromString]].
*/
function fromJSON(prop?: string): Id64String;
/** Given a string value, attempt to normalize it into a well-formed Id string.
* If the input is already a well-formed Id string, it is returned unmodified.
* Otherwise, the input is trimmed of leading and trailing whitespace, converted to lowercase, and an attempt is made to parse it as a 64-bit hexadecimal integer.
* If parsing succeeds the normalized result is returned; otherwise the result is "0", indicating an invalid Id.
*
* For a description of "well-formed", see [Working with Ids]($docs/learning/common/Id64.md).
*/
function fromString(val: string): Id64String;
/** Produce an Id string from a local and briefcase Id.
* @param localId The non-zero local Id as an unsigned 40-bit integer.
* @param briefcaseId The briefcase Id as an unsigned 24-bit integer.
* @returns an Id64String containing the hexadecimal string representation of the unsigned 64-bit integer which would result from the
* operation `localId | (briefcaseId << 40)`, or an invalid Id "0" if the inputs are invalid.
*/
function fromLocalAndBriefcaseIds(localId: number, briefcaseId: number): Id64String;
/** Create an Id64String from a pair of unsigned 32-bit integers.
* @param lowBytes The lower 4 bytes of the Id
* @param highBytes The upper 4 bytes of the Id
* @returns an Id64String containing the hexadecimal string representation of the unsigned 64-bit integer which would result from the
* operation `lowBytes | (highBytes << 32)`.
* @see [[Id64.fromUint32PairObject]] if you have a [[Id64.Uint32Pair]] object.
*/
function fromUint32Pair(lowBytes: number, highBytes: number): Id64String;
/** Create an Id64String from a [[Id64.Uint32Pair]].
* @see [[Id64.fromUint32Pair]].
*/
function fromUint32PairObject(pair: Uint32Pair): Id64String;
/** Returns true if the inputs represent two halves of a valid 64-bit Id.
* @see [[Id64.Uint32Pair]].
*/
function isValidUint32Pair(lowBytes: number, highBytes: number): boolean;
/** Represents an [[Id64]] as a pair of unsigned 32-bit integers. Because Javascript lacks efficient support for 64-bit integers,
* this representation can be useful in performance-sensitive code like the render loop.
* @see [[Id64.getUint32Pair]] to convert an [[Id64String]] to a Uint32Pair.
* @see [[Id64.fromUint32Pair]] to convert a Uint32Pair to an [[Id64String]].
* @see [[Id64.Uint32Set]] and [[Id64.Uint32Map]] for collections based on Uint32Pairs.
*/
interface Uint32Pair {
/** The lower 4 bytes of the 64-bit integer. */
lower: number;
/** The upper 4 bytes of the 64-bit integer. */
upper: number;
}
/** Convert an Id64String to a 64-bit unsigned integer represented as a pair of unsigned 32-bit integers.
* @param id The well-formed string representation of a 64-bit Id.
* @param out Used as the return value if supplied; otherwise a new object is returned.
* @returns An object containing the parsed lower and upper 32-bit integers comprising the 64-bit Id.
*/
function getUint32Pair(id: Id64String, out?: Uint32Pair): Uint32Pair;
/** Extract an unsigned 32-bit integer from the lower 4 bytes of an Id64String. */
function getLowerUint32(id: Id64String): number;
/** Extract an unsigned 32-bit integer from the upper 4 bytes of an Id64String. */
function getUpperUint32(id: Id64String): number;
/** Convert an [[Id64Arg]] into an [[Id64Set]].
*
* This method can be used by functions that accept an Id64Arg to conveniently process the value(s). For example:
* ```ts
* public addCategories(arg: Id64Arg) { Id64.toIdSet(arg).forEach((id) => this.categories.add(id)); }
* ```
*
* Alternatively, to avoid allocating a new Id64Set, use [[Id64.iterable]].
*
* @param arg The Ids to convert to an Id64Set.
* @param makeCopy If true, and the input is already an Id64Set, returns a deep copy of the input.
* @returns An Id64Set containing the set of [[Id64String]]s represented by the Id64Arg.
*/
function toIdSet(arg: Id64Arg, makeCopy?: boolean): Id64Set;
/** Obtain iterator over the specified Ids.
* @see [[Id64.iterable]].
*/
function iterator(ids: Id64Arg): Iterator<Id64String>;
/** Obtain an iterable over the specified Ids. Example usage:
* ```ts
* const ids = ["0x123", "0xfed"];
* for (const id of Id64.iterable(ids))
* console.log(id);
* ```
*/
function iterable(ids: Id64Arg): Iterable<Id64String>;
/** Return the first [[Id64String]] of an [[Id64Arg]]. */
function getFirst(arg: Id64Arg): Id64String;
/** Return the number of [[Id64String]]s represented by an [[Id64Arg]]. */
function sizeOf(arg: Id64Arg): number;
/** Returns true if the [[Id64Arg]] contains the specified Id. */
function has(arg: Id64Arg, id: Id64String): boolean;
/** The string representation of an invalid Id. */
const invalid = "0";
/** Determine if the supplied id string represents a transient Id.
* @param id A well-formed Id string.
* @returns true if the Id represents a transient Id.
* @note This method assumes the input is a well-formed Id string.
* @see [[Id64.isTransientId64]]
* @see [[TransientIdSequence]]
*/
function isTransient(id: Id64String): boolean;
/** Determine if the input is a well-formed [[Id64String]] and represents a transient Id.
* @see [[Id64.isTransient]]
* @see [[Id64.isId64]]
* @see [[TransientIdSequence]]
*/
function isTransientId64(id: string): boolean;
/** Determine if the input is a well-formed [[Id64String]].
*
* For a description of "well-formed", see [Working with Ids]($docs/learning/common/Id64.md).
* @see [[Id64.isValidId64]]
*/
function isId64(id: string): boolean;
/** Returns true if the input is not equal to the representation of an invalid Id.
* @note This method assumes the input is a well-formed Id string.
* @see [[Id64.isInvalid]]
* @see [[Id64.isValidId64]]
*/
function isValid(id: Id64String): boolean;
/** Returns true if the input is a well-formed [[Id64String]] representing a valid Id.
* @see [[Id64.isValid]]
* @see [[Id64.isId64]]
*/
function isValidId64(id: string): boolean;
/** Returns true if the input is a well-formed [[Id64String]] representing an invalid Id.
* @see [[Id64.isValid]]
*/
function isInvalid(id: Id64String): boolean;
/** A specialized replacement for Set<Id64String> optimized for performance-critical code which represents large sets of [[Id64]]s as pairs of
* 32-bit integers.
* The internal representation is a Map<number, Set<number>> where the Map key is the upper 4 bytes of the IDs and the Set elements are the lower 4 bytes of the IDs.
* Because the upper 4 bytes store the 24-bit briefcase ID plus the upper 8 bits of the local ID, there will be a very small distribution of unique Map keys.
* To further optimize this data type, the following assumptions are made regarding the { lower, upper } inputs, and no validation is performed to confirm them:
* - The inputs are unsigned 32-bit integers;
* - The inputs represent a valid Id64String (e.g., local ID is not zero).
* @see [[Id64.Uint32Map]] for a similarly-optimized replacement for Map<Id64String, T>
* @public
*/
class Uint32Set {
protected readonly _map: Map<number, Set<number>>;
/** Construct a new Uint32Set.
* @param ids If supplied, all of the specified Ids will be added to the new set.
*/
constructor(ids?: Id64Arg);
/** Return true if `this` and `other` contain the same set of Ids. */
equals(other: Uint32Set): boolean;
/** Remove all contents of this set. */
clear(): void;
/** Add an Id to the set. */
addId(id: Id64String): void;
/** Add any number of Ids to the set. */
addIds(ids: Id64Arg): void;
/** Returns true if the set contains the specified Id. */
hasId(id: Id64String): boolean;
/** Add an Id to the set. */
add(low: number, high: number): void;
/** Remove an Id from the set. */
deleteId(id: Id64String): void;
/** Remove any number of Ids from the set. */
deleteIds(ids: Id64Arg): void;
/** Remove an Id from the set. */
delete(low: number, high: number): void;
/** Returns true if the set contains the specified Id. */
has(low: number, high: number): boolean;
/** Returns true if the set contains the Id specified by `pair`. */
hasPair(pair: Uint32Pair): boolean;
/** Returns true if the set contains no Ids. */
get isEmpty(): boolean;
/** Returns the number of Ids contained in the set. */
get size(): number;
/** Populates and returns an array of all Ids contained in the set. */
toId64Array(): Id64Array;
/** Populates and returns a set of all Ids contained in the set. */
toId64Set(): Id64Set;
/** Execute a function against each Id in this set. */
forEach(func: (lo: number, hi: number) => void): void;
}
/** A specialized replacement for Map<Id64String, T> optimized for performance-critical code.
* @see [[Id64.Uint32Set]] for implementation details.
* @public
*/
class Uint32Map<T> {
protected readonly _map: Map<number, Map<number, T>>;
/** Remove all entries from the map. */
clear(): void;
/** Find an entry in the map by Id. */
getById(id: Id64String): T | undefined;
/** Set an entry in the map by Id. */
setById(id: Id64String, value: T): void;
/** Set an entry in the map by Id components. */
set(low: number, high: number, value: T): void;
/** Get an entry from the map by Id components. */
get(low: number, high: number): T | undefined;
/** Returns true if the map contains no entries. */
get isEmpty(): boolean;
/** Returns the number of entries in the map. */
get size(): number;
/** Execute a function against each entry in this map. */
forEach(func: (lo: number, hi: number, value: T) => void): void;
}
}
/** JSON representation of a [[TransientIdSequence]], primarily useful for transferring sequences to and from a [Worker](https://developer.mozilla.org/en-US/docs/Web/API/Worker).
* It stores two "local" 40-bit Ids describing the range of [Id64String]($docs/learning/common/Id64.md)s generated by the sequence.
* @public
*/
export interface TransientIdSequenceProps {
/** The starting local Id. The sequence begins at `initialLocalId + 1`. */
initialLocalId: number;
/** The maximum local Id generated by the sequence thus far. It is never less than [[initialLocalId]]. If it is equal to [[initialLocalId]], then the sequence has
* not yet generated any Ids.
* The next local Id generated by the sequence will be `currentLocalId + 1`.
*/
currentLocalId: number;
}
/** A function returned by [[TransientIdSequence.merge]] that remaps the local Id portion of an [Id64String]($docs/learning/common/Id64.md) generated by
* the source sequence to the corresponding local Id in the target sequence.
* It returns `sourceLocalId` if the input did not originate from the source sequence.
* @public
*/
export type RemapTransientLocalId = (sourceLocalId: number) => number;
/**
* Generates unique [[Id64String]] values in sequence, which are guaranteed not to conflict with Ids associated with persistent elements or models.
* This is useful for associating stable, non-persistent identifiers with things like [Decorator]($frontend)s.
* A TransientIdSequence can generate a maximum of (2^40)-2 unique Ids.
* @public
*/
export declare class TransientIdSequence {
/** The starting local Id provided to the constructor. The sequence begins at `initialLocalId + 1`. */
readonly initialLocalId: number;
private _localId;
/** Constructor.
* @param initialLocalId The starting local Id. The local Id of the first [[Id64String]] generated by [[getNext]] will be `initialLocalId + 1`.
*/
constructor(initialLocalId?: number);
/** The maximum local Id generated by the sequence thus far. It is never less than [[initialLocalId]]. If it is equal to [[initialLocalId]], then the sequence has
* not yet generated any Ids.
* Each call to [[getNext]] increments this by 1 and uses it as the local Id of the generated [[Id64String]].
*/
get currentLocalId(): number;
/** Generate and return the next transient Id64String in the sequence. */
getNext(): Id64String;
/** Preview the transient Id64String that will be returned by the next call to [[getNext]].
* This is primarily useful for tests.
*/
peekNext(): Id64String;
/** Convert this sequence to its JSON representation. */
toJSON(): TransientIdSequenceProps;
/** Create a sequence from its JSON representation. */
static fromJSON(props: TransientIdSequenceProps): TransientIdSequence;
/** Obtain the JSON representation of a new sequence that diverges from this sequence, with its [[initialLocalId]] set to this sequence's [[currentLocalId]].
* The two sequences can generate Ids independently. Later, you can [[merge]] the sequences, resolving conflicts where the two sequences generated identical Ids.
* This is chiefly useful when generating transient Ids on a [Worker](https://developer.mozilla.org/en-US/docs/Web/API/Worker).
*/
fork(): TransientIdSequenceProps;
/** Integrate the Ids generated by a [[fork]] of this sequence. All of the Ids generated by `source` will be remapped to Ids at the end of this sequence.
* This is chiefly useful when generating transient Ids on a [Worker](https://developer.mozilla.org/en-US/docs/Web/API/Worker).
* @param source The JSON representation of the [[fork]]ed sequence to be merged with this one.
* @returns a function that permits you to remap the local Ids generated by `source` into the corresponding local Ids assigned by this sequence.
* @throws Error if `source` is not a fork of this sequence or is malformed (e.g., contains negative and/or non-integer local Ids).
*/
merge(source: TransientIdSequenceProps): (sourceLocalId: number) => number;
}
/**
* The Guid namespace provides facilities for working with GUID strings using the "8-4-4-4-12" pattern.
*
* The [[GuidString]] type alias is used to indicate function arguments, return types, and variables which are known to
* be in the GUID format.
* @public
*/
export declare namespace Guid {
/** Represents the empty Guid 00000000-0000-0000-0000-000000000000 */
const empty: GuidString;
/** Determine whether the input string is "guid-like". That is, it follows the 8-4-4-4-12 pattern. This does not enforce
* that the string is actually in valid UUID format.
*/
function isGuid(value: string): boolean;
/** Determine whether the input string is a valid V4 Guid string */
function isV4Guid(value: string): boolean;
/** Create a new V4 Guid value */
function createValue(): GuidString;
/**
* Normalize a Guid string if possible. Normalization consists of:
* - Convert all characters to lower case
* - Trim any leading or trailing whitespace
* - Convert to the standard Guid format "8-4-4-4-12", repositioning the '-' characters as necessary, presuming there are exactly 32 hexadecimal digits.
* @param value Input value that represents a Guid
* @returns Normalized representation of the Guid string. If the normalization fails, return the *original* value unmodified (Note: it is *not* a valid Guid)
*/
function normalize(value: GuidString): GuidString;
}
//# sourceMappingURL=Id.d.ts.map