public interface ChainKeyValueStorage<K,V,EN extends AbstractChainEntry<KeyValue<K,V>,K,V,EN>> extends ChainStorage<KeyValue<K,V>,K,V,EN>
ChainStorage.Entry<E,K,V,EN extends ChainStorage.Entry<E,K,V,EN>>| Modifier and Type | Method and Description |
|---|---|
long |
consolidate()
Removes all empty entries from the passed chain and returns the number of removed entries.
|
EN |
getChainEntry(long index) |
EN |
getIntervalLowChainEntry(long lowIndex,
long highIndex) |
EN |
getRangeChainEntry(long offset,
long length) |
ReferenceType |
getReferenceType() |
ReferenceType |
getValueReferenceType() |
boolean |
hasVolatileElements() |
boolean |
hasVolatileValues() |
VarString |
keyAppendTo(VarString vc) |
VarString |
keyAppendTo(VarString vc,
BiConsumer<VarString,? super K> keyAppender) |
VarString |
keyAppendTo(VarString vc,
BiConsumer<VarString,? super K> keyAppender,
char separator) |
VarString |
keyAppendTo(VarString vc,
BiConsumer<VarString,? super K> keyAppender,
String separator) |
VarString |
keyAppendTo(VarString vc,
char separator) |
VarString |
keyAppendTo(VarString vc,
String separator) |
boolean |
keyApplies(Predicate<? super K> predicate) |
boolean |
keyAppliesAll(Predicate<? super K> predicate) |
boolean |
keyContains(K element) |
boolean |
keyContains(K sample,
Equalator<? super K> equalator) |
boolean |
keyContainsAll(K[] elements,
int elementsOffset,
int elementsLength) |
boolean |
keyContainsAll(XGettingCollection<? extends K> elements) |
boolean |
keyContainsId(K element) |
boolean |
keyContainsNull() |
<C extends Consumer<? super K>> |
keyCopySelection(C target,
long... indices) |
<C extends Consumer<? super K>> |
keyCopyTo(C target) |
<C extends Consumer<? super K>> |
keyCopyTo(C target,
Predicate<? super K> predicate) |
int |
keyCopyToArray(int offset,
int length,
Object[] target,
int targetOffset) |
int |
keyCount(K element) |
int |
keyCount(K sample,
Equalator<? super K> equalator) |
int |
keyCount(Predicate<? super K> predicate) |
<C extends Consumer<? super K>> |
keyDistinct(C target) |
<C extends Consumer<? super K>> |
keyDistinct(C target,
Equalator<? super K> equalator) |
boolean |
keyEqualsContent(XGettingCollection<? extends K> other,
Equalator<? super K> equalator) |
<C extends Consumer<? super K>> |
keyExcept(XGettingCollection<? extends K> collection,
Equalator<? super K> equalator,
C target) |
void |
keyFill(int offset,
int length,
K element) |
K |
keyFirst() |
K |
keyGet(long index) |
boolean |
keyHasDistinctValues() |
boolean |
keyHasDistinctValues(Equalator<? super K> equalator) |
int |
keyIndexBy(Predicate<? super K> predicate) |
int |
keyIndexOf(K element) |
int |
keyIndexOf(K sample,
Equalator<? super K> equalator) |
<C extends Consumer<? super K>> |
keyIntersect(XGettingCollection<? extends K> collection,
Equalator<? super K> equalator,
C target) |
boolean |
keyIsSorted(Comparator<? super K> keyComparator) |
void |
keyIterate(Consumer<? super K> procedure) |
void |
keyIterate(Predicate<? super K> predicate,
Consumer<? super K> procedure) |
void |
keyIterateIndexed(IndexedAcceptor<? super K> procedure) |
Iterator<K> |
keyIterator() |
<A> void |
keyJoin(BiConsumer<? super K,A> joiner,
A keyAggregate) |
K |
keyLast() |
int |
keyLastIndexBy(Predicate<? super K> predicate) |
int |
keyLastIndexOf(K element) |
int |
keyLastIndexOf(K sample,
Equalator<? super K> equalator) |
K |
keyMax(Comparator<? super K> keyComparator) |
int |
keyMaxIndex(Comparator<? super K> keyComparator) |
K |
keyMin(Comparator<? super K> keyComparator) |
int |
keyMinIndex(Comparator<? super K> keyComparator) |
int |
keyMoveRange(int offset,
int length,
Consumer<? super K> target) |
int |
keyMoveSelection(Consumer<? super K> target,
long... indices) |
int |
keyMoveTo(Consumer<? super K> target,
Predicate<? super K> predicate) |
int |
keyProcess(Consumer<? super K> procedure) |
int |
keyReduce(Predicate<? super K> predicate) |
int |
keyRemove(K element) |
int |
keyRemove(K sample,
Equalator<? super K> equalator) |
K |
keyRemove(long index) |
int |
keyRemoveAll(K[] elements,
int elementsOffset,
int elementsLength) |
int |
keyRemoveAll(XGettingCollection<? extends K> elements) |
int |
keyRemoveDuplicates() |
int |
keyRemoveDuplicates(Equalator<? super K> equalator) |
int |
keyRemoveNull() |
boolean |
keyRemoveOne(K element) |
boolean |
keyRemoveOne(K sample,
Equalator<? super K> equalator) |
int |
keyReplace(K element,
K replacement) |
int |
keyReplaceAll(K[] elements,
int elementsOffset,
int elementsLength,
K replacement) |
int |
keyReplaceAll(XGettingCollection<? extends K> elements,
K replacement) |
int |
keyReplaceOne(K element,
K replacement) |
int |
keyRetainAll(K[] elements,
int elementsOffset,
int elementsLength) |
int |
keyRetainAll(XGettingCollection<? extends K> elements) |
int |
keyRetainAll(XGettingCollection<? extends K> samples,
Equalator<? super K> equalator) |
K |
keyRetrieve(K element) |
K |
keyRetrieve(K sample,
Equalator<? super K> equalator) |
K |
keyRetrieve(Predicate<? super K> predicate) |
int |
keyScan(Predicate<? super K> predicate) |
K |
keySearch(Predicate<? super K> predicate) |
K |
keySeek(K sample) |
K |
keySeek(K sample,
Equalator<? super K> equalator) |
void |
keySet(int offset,
K... elements) |
void |
keySet(int offset,
K[] elements,
int elementsOffset,
int elementsLength) |
void |
keySort(Comparator<? super K> keyComparator) |
long |
keySubstitute(Function<? super K,? extends K> mapper,
BiConsumer<EN,K> callback) |
int |
keySubstitute(Predicate<? super K> predicate,
Function<? super K,? extends K> mapper) |
int |
keySubstitute(Predicate<? super K> predicate,
K keySubstitute) |
int |
keySubstituteOne(Predicate<? super K> predicate,
K keySubstitute) |
Object[] |
keyToArray() |
K[] |
keyToArray(Class<K> type) |
<C extends Consumer<? super K>> |
keyUnion(XGettingCollection<? extends K> collection,
Equalator<? super K> equalator,
C target) |
void |
removeRange(long offset,
long length) |
long |
removeSelection(long... indices)
Removes all entries at the indices (offsets) given in the passed
int array. |
void |
reverse() |
V |
searchValue(K key,
Equalator<? super K> equalator) |
void |
shiftBy(long sourceIndex,
long distance) |
void |
shiftBy(long sourceIndex,
long distance,
long length) |
void |
shiftTo(long sourceIndex,
long targetIndex) |
void |
shiftTo(long sourceIndex,
long targetIndex,
long length) |
void |
shuffle() |
long |
size() |
void |
swap(long indexA,
long indexB) |
void |
swap(long indexA,
long indexB,
long length) |
VarString |
valuesAppendTo(VarString vc) |
VarString |
valuesAppendTo(VarString vc,
BiConsumer<VarString,? super V> appender) |
VarString |
valuesAppendTo(VarString vc,
BiConsumer<VarString,? super V> appender,
char separator) |
VarString |
valuesAppendTo(VarString vc,
BiConsumer<VarString,? super V> appender,
String separator) |
VarString |
valuesAppendTo(VarString vc,
char separator) |
VarString |
valuesAppendTo(VarString vc,
String separator) |
boolean |
valuesApplies(Predicate<? super V> predicate) |
boolean |
valuesAppliesAll(Predicate<? super V> predicate) |
boolean |
valuesContains(V element) |
boolean |
valuesContains(V sample,
Equalator<? super V> equalator) |
boolean |
valuesContainsAll(V[] values,
int elementsOffset,
int elementsLength) |
boolean |
valuesContainsAll(V[] values,
int elementsOffset,
int elementsLength,
Equalator<? super V> equalator) |
boolean |
valuesContainsAll(XGettingCollection<? extends V> elements) |
boolean |
valuesContainsAll(XGettingCollection<? extends V> elements,
Equalator<? super V> equalator) |
boolean |
valuesContainsId(V element) |
boolean |
valuesContainsNull() |
<C extends Consumer<? super V>> |
valuesCopySelection(C target,
long... indices) |
<C extends Consumer<? super V>> |
valuesCopyTo(C target) |
<C extends Consumer<? super V>> |
valuesCopyTo(C target,
Predicate<? super V> predicate) |
int |
valuesCopyToArray(long offset,
int length,
Object[] target,
int targetOffset) |
int |
valuesCount(Predicate<? super V> predicate) |
int |
valuesCount(V element) |
int |
valuesCount(V sample,
Equalator<? super V> equalator) |
<C extends Consumer<? super V>> |
valuesDistinct(C target) |
<C extends Consumer<? super V>> |
valuesDistinct(C target,
Equalator<? super V> equalator) |
boolean |
valuesEqualsContent(XGettingCollection<? extends V> other,
Equalator<? super V> equalator) |
<C extends Consumer<? super V>> |
valuesExcept(XGettingCollection<? extends V> collection,
Equalator<? super V> equalator,
C target) |
void |
valuesFill(long offset,
long length,
V value) |
V |
valuesFirst() |
V |
valuesGet(long index) |
boolean |
valuesHasDistinctValues() |
boolean |
valuesHasDistinctValues(Equalator<? super V> equalator) |
int |
valuesIndexBy(Predicate<? super V> predicate) |
int |
valuesIndexOf(V element) |
int |
valuesIndexOf(V sample,
Equalator<? super V> equalator) |
<C extends Consumer<? super V>> |
valuesIntersect(XGettingCollection<? extends V> collection,
Equalator<? super V> equalator,
C target) |
boolean |
valuesIsSorted(Comparator<? super V> comparator) |
void |
valuesIterate(Consumer<? super V> procedure) |
void |
valuesIterate(Predicate<? super V> predicate,
Consumer<? super V> procedure) |
void |
valuesIterateIndexed(IndexedAcceptor<? super V> procedure) |
Iterator<V> |
valuesIterator() |
<A> void |
valuesJoin(BiConsumer<? super V,A> joiner,
A aggregate) |
V |
valuesLast() |
int |
valuesLastIndexBy(Predicate<? super V> predicate) |
int |
valuesLastIndexOf(V element) |
int |
valuesLastIndexOf(V sample,
Equalator<? super V> equalator) |
ListIterator<V> |
valuesListIterator(long index) |
V |
valuesMax(Comparator<? super V> comparator) |
int |
valuesMaxIndex(Comparator<? super V> comparator) |
V |
valuesMin(Comparator<? super V> comparator) |
int |
valuesMinIndex(Comparator<? super V> comparator) |
int |
valuesMoveRange(int offset,
int length,
Consumer<? super V> target) |
int |
valuesMoveSelection(Consumer<? super V> target,
long... indices) |
int |
valuesMoveTo(Consumer<? super V> target,
Predicate<? super V> predicate) |
int |
valuesProcess(Consumer<? super V> procedure) |
int |
valuesReduce(Predicate<? super V> predicate) |
V |
valuesRemove(long index) |
int |
valuesRemove(V element) |
int |
valuesRemove(V sample,
Equalator<? super V> equalator) |
int |
valuesRemoveAll(V[] values,
int elementsOffset,
int elementsLength) |
int |
valuesRemoveAll(V[] samples,
int samplesOffset,
int samplesLength,
Equalator<? super V> equalator) |
int |
valuesRemoveAll(XGettingCollection<? extends V> elements) |
int |
valuesRemoveAll(XGettingCollection<? extends V> samples,
Equalator<? super V> equalator) |
int |
valuesRemoveDuplicates() |
int |
valuesRemoveDuplicates(Equalator<? super V> equalator) |
int |
valuesRemoveNull() |
boolean |
valuesRemoveOne(V element) |
boolean |
valuesRemoveOne(V sample,
Equalator<? super V> equalator) |
int |
valuesReplace(V sample,
Equalator<? super V> equalator,
V replacement) |
int |
valuesReplace(V element,
V replacement) |
int |
valuesReplaceAll(V[] samples,
int samplesOffset,
int samplesLength,
Equalator<? super V> equalator,
V replacement) |
int |
valuesReplaceAll(V[] values,
int valuesOffset,
int valuesLength,
V replacement) |
int |
valuesReplaceAll(XGettingCollection<? extends V> samples,
Equalator<? super V> equalator,
V replacement) |
int |
valuesReplaceAll(XGettingCollection<? extends V> elements,
V replacement) |
boolean |
valuesReplaceOne(V sample,
Equalator<? super V> equalator,
V replacement) |
boolean |
valuesReplaceOne(V element,
V replacement) |
int |
valuesRetainAll(V[] values,
int elementsOffset,
int elementsLength) |
int |
valuesRetainAll(V[] samples,
int elementsOffset,
int elementsLength,
Equalator<? super V> equalator) |
int |
valuesRetainAll(XGettingCollection<? extends V> elements) |
int |
valuesRetainAll(XGettingCollection<? extends V> samples,
Equalator<? super V> equalator) |
V |
valuesRetrieve(Predicate<? super V> predicate) |
V |
valuesRetrieve(V element) |
int |
valuesScan(Predicate<? super V> predicate) |
V |
valuesSearch(Predicate<? super V> predicate) |
V |
valuesSearch(V sample,
Equalator<? super V> equalator) |
V |
valuesSeek(V sample) |
V |
valuesSet(long offset,
V value) |
void |
valuesSet(long offset,
V[] values) |
void |
valuesSet(long offset,
V[] values,
int valuesOffset,
int valuesLength) |
void |
valuesSort(Comparator<? super V> comparator) |
int |
valuesSubstitute(Function<? super V,? extends V> mapper) |
int |
valuesSubstitute(Predicate<? super V> predicate,
Function<V,V> mapper) |
int |
valuesSubstitute(Predicate<? super V> predicate,
V substitute) |
boolean |
valuesSubstituteOne(Predicate<? super V> predicate,
V substitute) |
Object[] |
valuesToArray() |
V[] |
valuesToArray(Class<V> type) |
String |
valuesToString() |
<C extends Consumer<? super V>> |
valuesUnion(XGettingCollection<? extends V> collection,
Equalator<? super V> equalator,
C target) |
appendEntry, appendTo, appendTo, appendTo, appendTo, appendTo, appendTo, appliesAll, clear, contains, contains, containsAll, containsAll, containsId, containsNull, containsSearched, copySelection, copyTo, copyTo, copyToArray, count, count, count, distinct, distinct, equalsContent, except, fill, first, get, hasDistinctValues, hasDistinctValues, indexOf, indexOf, indexOf, intersect, isSorted, iterate, iterate, iterateIndexed, iterator, join, last, lastIndexBy, lastIndexOf, lastIndexOf, max, maxIndex, min, minIndex, moveRange, moveSelection, moveTo, prependEntry, process, reduce, remove, remove, remove, removeAll, removeAll, removeDuplicates, removeDuplicates, removeNull, removeOne, removeOne, replace, replaceAll, replaceAll, replaceBy, replaceOne, replaceOneBy, retainAll, retainAll, retainAll, retainRange, retrieve, retrieve, retrieve, scan, search, seek, seek, set, set, sort, substitute, substitute, toArray, toArray, toString, unionforEach, spliteratorEN getChainEntry(long index) throws IndexOutOfBoundsException
getChainEntry in interface ChainStorage<KeyValue<K,V>,K,V,EN extends AbstractChainEntry<KeyValue<K,V>,K,V,EN>>IndexOutOfBoundsExceptionEN getRangeChainEntry(long offset, long length) throws IndexOutOfBoundsException
getRangeChainEntry in interface ChainStorage<KeyValue<K,V>,K,V,EN extends AbstractChainEntry<KeyValue<K,V>,K,V,EN>>IndexOutOfBoundsExceptionEN getIntervalLowChainEntry(long lowIndex, long highIndex) throws IndexOutOfBoundsException
getIntervalLowChainEntry in interface ChainStorage<KeyValue<K,V>,K,V,EN extends AbstractChainEntry<KeyValue<K,V>,K,V,EN>>IndexOutOfBoundsExceptionlong size()
long consolidate()
consolidate in interface ChainStorage<KeyValue<K,V>,K,V,EN extends AbstractChainEntry<KeyValue<K,V>,K,V,EN>>boolean hasVolatileElements()
hasVolatileElements in interface ChainStorage<KeyValue<K,V>,K,V,EN extends AbstractChainEntry<KeyValue<K,V>,K,V,EN>>ReferenceType getReferenceType()
getReferenceType in interface ChainStorage<KeyValue<K,V>,K,V,EN extends AbstractChainEntry<KeyValue<K,V>,K,V,EN>>boolean keyEqualsContent(XGettingCollection<? extends K> other, Equalator<? super K> equalator)
void removeRange(long offset,
long length)
removeRange in interface ChainStorage<KeyValue<K,V>,K,V,EN extends AbstractChainEntry<KeyValue<K,V>,K,V,EN>>long removeSelection(long... indices)
int array.
Note that the indices array gets presorted to increase algorithm performance. If the original int array
shall be unchanged, a clone must be passed.
removeSelection in interface ChainStorage<KeyValue<K,V>,K,V,EN extends AbstractChainEntry<KeyValue<K,V>,K,V,EN>>indices - the indices (offsets) of the entries to be removed.boolean keyContainsNull()
boolean keyContainsId(K element)
boolean keyContains(K element)
boolean keyContainsAll(K[] elements, int elementsOffset, int elementsLength)
boolean keyContainsAll(XGettingCollection<? extends K> elements)
int keyCount(K element)
<C extends Consumer<? super K>> C keyIntersect(XGettingCollection<? extends K> collection, Equalator<? super K> equalator, C target)
<C extends Consumer<? super K>> C keyExcept(XGettingCollection<? extends K> collection, Equalator<? super K> equalator, C target)
<C extends Consumer<? super K>> C keyUnion(XGettingCollection<? extends K> collection, Equalator<? super K> equalator, C target)
int keyCopyToArray(int offset,
int length,
Object[] target,
int targetOffset)
Object[] keyToArray()
K keyFirst()
K keyLast()
K keyGet(long index)
K keyMin(Comparator<? super K> keyComparator)
K keyMax(Comparator<? super K> keyComparator)
<A> void keyJoin(BiConsumer<? super K,A> joiner, A keyAggregate)
void keyIterateIndexed(IndexedAcceptor<? super K> procedure)
int keyIndexOf(K element)
int keyLastIndexOf(K element)
int keyMinIndex(Comparator<? super K> keyComparator)
int keyMaxIndex(Comparator<? super K> keyComparator)
boolean keyHasDistinctValues()
VarString keyAppendTo(VarString vc, BiConsumer<VarString,? super K> keyAppender)
VarString keyAppendTo(VarString vc, BiConsumer<VarString,? super K> keyAppender, char separator)
VarString keyAppendTo(VarString vc, BiConsumer<VarString,? super K> keyAppender, String separator)
K keyRemove(long index)
int keyRemoveNull()
boolean keyRemoveOne(K element)
int keyRemove(K element)
int keyRemoveAll(K[] elements, int elementsOffset, int elementsLength)
int keyRemoveAll(XGettingCollection<? extends K> elements)
int keyRemoveDuplicates()
int keyRetainAll(K[] elements, int elementsOffset, int elementsLength)
int keyRetainAll(XGettingCollection<? extends K> elements)
int keyRetainAll(XGettingCollection<? extends K> samples, Equalator<? super K> equalator)
void keySort(Comparator<? super K> keyComparator)
boolean keyIsSorted(Comparator<? super K> keyComparator)
void keySet(int offset,
K... elements)
void keySet(int offset,
K[] elements,
int elementsOffset,
int elementsLength)
void keyFill(int offset,
int length,
K element)
int keyReplaceAll(K[] elements, int elementsOffset, int elementsLength, K replacement)
int keyReplaceAll(XGettingCollection<? extends K> elements, K replacement)
int keySubstitute(Predicate<? super K> predicate, Function<? super K,? extends K> mapper)
boolean hasVolatileValues()
ReferenceType getValueReferenceType()
ListIterator<V> valuesListIterator(long index)
boolean valuesEqualsContent(XGettingCollection<? extends V> other, Equalator<? super V> equalator)
boolean valuesContainsNull()
boolean valuesContainsId(V element)
boolean valuesContains(V element)
boolean valuesContainsAll(V[] values, int elementsOffset, int elementsLength)
boolean valuesContainsAll(V[] values, int elementsOffset, int elementsLength, Equalator<? super V> equalator)
boolean valuesContainsAll(XGettingCollection<? extends V> elements)
boolean valuesContainsAll(XGettingCollection<? extends V> elements, Equalator<? super V> equalator)
int valuesCount(V element)
<C extends Consumer<? super V>> C valuesIntersect(XGettingCollection<? extends V> collection, Equalator<? super V> equalator, C target)
<C extends Consumer<? super V>> C valuesExcept(XGettingCollection<? extends V> collection, Equalator<? super V> equalator, C target)
<C extends Consumer<? super V>> C valuesUnion(XGettingCollection<? extends V> collection, Equalator<? super V> equalator, C target)
<C extends Consumer<? super V>> C valuesCopySelection(C target, long... indices)
int valuesCopyToArray(long offset,
int length,
Object[] target,
int targetOffset)
<C extends Consumer<? super V>> C valuesCopyTo(C target, Predicate<? super V> predicate)
Object[] valuesToArray()
V valuesFirst()
V valuesLast()
V valuesGet(long index)
V valuesMin(Comparator<? super V> comparator)
V valuesMax(Comparator<? super V> comparator)
void valuesIterateIndexed(IndexedAcceptor<? super V> procedure)
<A> void valuesJoin(BiConsumer<? super V,A> joiner, A aggregate)
int valuesIndexOf(V element)
int valuesLastIndexOf(V element)
int valuesMinIndex(Comparator<? super V> comparator)
int valuesMaxIndex(Comparator<? super V> comparator)
boolean valuesHasDistinctValues()
<C extends Consumer<? super V>> C valuesDistinct(C target, Equalator<? super V> equalator)
VarString valuesAppendTo(VarString vc, BiConsumer<VarString,? super V> appender)
VarString valuesAppendTo(VarString vc, BiConsumer<VarString,? super V> appender, char separator)
VarString valuesAppendTo(VarString vc, BiConsumer<VarString,? super V> appender, String separator)
String valuesToString()
V valuesRemove(long index)
int valuesRemoveNull()
boolean valuesRemoveOne(V element)
int valuesRemove(V element)
int valuesRemoveAll(V[] values, int elementsOffset, int elementsLength)
int valuesRemoveAll(V[] samples, int samplesOffset, int samplesLength, Equalator<? super V> equalator)
int valuesRemoveAll(XGettingCollection<? extends V> elements)
int valuesRemoveAll(XGettingCollection<? extends V> samples, Equalator<? super V> equalator)
int valuesRemoveDuplicates()
int valuesRetainAll(V[] values, int elementsOffset, int elementsLength)
int valuesRetainAll(V[] samples, int elementsOffset, int elementsLength, Equalator<? super V> equalator)
int valuesRetainAll(XGettingCollection<? extends V> elements)
int valuesRetainAll(XGettingCollection<? extends V> samples, Equalator<? super V> equalator)
void valuesSort(Comparator<? super V> comparator)
boolean valuesIsSorted(Comparator<? super V> comparator)
void valuesSet(long offset,
V[] values)
void valuesSet(long offset,
V[] values,
int valuesOffset,
int valuesLength)
void valuesFill(long offset,
long length,
V value)
int valuesReplaceAll(V[] values, int valuesOffset, int valuesLength, V replacement)
int valuesReplaceAll(V[] samples, int samplesOffset, int samplesLength, Equalator<? super V> equalator, V replacement)
int valuesReplaceAll(XGettingCollection<? extends V> elements, V replacement)
int valuesReplaceAll(XGettingCollection<? extends V> samples, Equalator<? super V> equalator, V replacement)
void shiftTo(long sourceIndex,
long targetIndex)
void shiftTo(long sourceIndex,
long targetIndex,
long length)
void shiftBy(long sourceIndex,
long distance)
void shiftBy(long sourceIndex,
long distance,
long length)
void swap(long indexA,
long indexB)
void swap(long indexA,
long indexB,
long length)
void reverse()
Copyright © 2022 MicroStream Software. All rights reserved.