Public Enum EnumMethod ' Метод перечисления для For each
Public Enum EnumMethod ' Метод перечисления для For each
ENUM_BY_KEY
ENUM_BY_KEY
ENUM_BY_VALUE
ENUM_BY_VALUE
End Enum
End Enum
Private Declare Function SetEnvironmentVariable Lib "kernel32" Alias "SetEnvironmentVariableW" (ByVal lpName As Long, ByVal lpValue As Long) As Long
Private Declare Function SetEnvironmentVariable Lib "kernel32" Alias "SetEnvironmentVariableW" (ByVal lpName As Long, ByVal lpValue As Long) As Long
Private Declare Function GetEnvironmentVariable Lib "kernel32" Alias "GetEnvironmentVariableW" (ByVal lpName As Long, ByVal lpBuffer As Long, ByVal nSize As Long) As Long
Private Declare Function GetEnvironmentVariable Lib "kernel32" Alias "GetEnvironmentVariableW" (ByVal lpName As Long, ByVal lpBuffer As Long, ByVal nSize As Long) As Long
Private Declare Function VirtualAlloc Lib "kernel32" (lpAddress As Any, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function VirtualAlloc Lib "kernel32" (lpAddress As Any, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function VirtualFree Lib "kernel32" (lpAddress As Any, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long
Private Declare Function VirtualFree Lib "kernel32" (lpAddress As Any, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long
Private Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GetProcessHeap Lib "kernel32" () As Long
Private Declare Function GetProcessHeap Lib "kernel32" () As Long
Private Declare Function GetMem8 Lib "msvbvm60" (Src As Any, Dst As Any) As Long
Private Declare Function GetMem8 Lib "msvbvm60" (Src As Any, Dst As Any) As Long
Private Declare Function GetMem4 Lib "msvbvm60" (Src As Any, Dst As Any) As Long
Private Declare Function GetMem4 Lib "msvbvm60" (Src As Any, Dst As Any) As Long
Private Declare Function GetMem2 Lib "msvbvm60" (Src As Any, Dst As Any) As Long
Private Declare Function GetMem2 Lib "msvbvm60" (Src As Any, Dst As Any) As Long
Private Declare Function GetMem1 Lib "msvbvm60" (Src As Any, Dst As Any) As Long
Private Declare Function GetMem1 Lib "msvbvm60" (Src As Any, Dst As Any) As Long
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleW" (ByVal lpModuleName As Long) As Long
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleW" (ByVal lpModuleName As Long) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function memcpy Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long) As Long
Private Declare Function memcpy Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long) As Long
Private Declare Function VarCmp Lib "oleaut32" (pvarLeft As Any, pvarRight As Any, ByVal lcid As Long, ByVal dwFlags As Long) As Long
Private Declare Function VarCmp Lib "oleaut32" (pvarLeft As Any, pvarRight As Any, ByVal lcid As Long, ByVal dwFlags As Long) As Long
Private Declare Function VariantCopy Lib "oleaut32" (pvargDest As Any, pvargSrc As Any) As Long
Private Declare Function VariantCopy Lib "oleaut32" (pvargDest As Any, pvargSrc As Any) As Long
Private Declare Function VariantCopyInd Lib "oleaut32" (pvarDest As Any, pvargSrc As Any) As Long
Private Declare Function VariantCopyInd Lib "oleaut32" (pvarDest As Any, pvargSrc As Any) As Long
Private Declare Function LCMapString Lib "kernel32" Alias "LCMapStringW" (ByVal Locale As Long, ByVal dwMapFlags As Long, lpSrcStr As Any, ByVal cchSrc As Long, lpDestStr As Any, ByVal cchDest As Long) As Long
Private Declare Function LCMapString Lib "kernel32" Alias "LCMapStringW" (ByVal Locale As Long, ByVal dwMapFlags As Long, lpSrcStr As Any, ByVal cchSrc As Long, lpDestStr As Any, ByVal cchDest As Long) As Long
Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long
Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long
Private Declare Function VarR4FromUI1 Lib "oleaut32" (value As Any, R4 As Any) As Long
Private Declare Function VarR4FromUI1 Lib "oleaut32" (value As Any, R4 As Any) As Long
Private Declare Function VarR4FromI2 Lib "oleaut32" (value As Any, R4 As Any) As Long
Private Declare Function VarR4FromI2 Lib "oleaut32" (value As Any, R4 As Any) As Long
Private Declare Function VarR4FromI4 Lib "oleaut32" (value As Any, R4 As Any) As Long
Private Declare Function VarR4FromI4 Lib "oleaut32" (value As Any, R4 As Any) As Long
Private Const LCMAP_LOWERCASE As Long = &H100
Private Const LCMAP_LOWERCASE As Long = &H100
Private Const PAGE_EXECUTE_READWRITE As Long = &H40&
Private Const PAGE_EXECUTE_READWRITE As Long = &H40&
Private Const MEM_COMMIT As Long = &H1000&
Private Const MEM_COMMIT As Long = &H1000&
Private Const MEM_RESERVE As Long = &H2000&
Private Const MEM_RESERVE As Long = &H2000&
Private Const MEM_RELEASE As Long = &H8000&
Private Const MEM_RELEASE As Long = &H8000&
Private Const HEAP_NO_SERIALIZE As Long = &H1
Private Const HEAP_NO_SERIALIZE As Long = &H1
Private Const GRANULARITY As Long = &H20
Private Const GRANULARITY As Long = &H20
Private Const HASH_SIZE As Long = 2999
Private Const HASH_SIZE As Long = 2999
Private Type tPointer ' Индекс в таблице объектов
Private Type tPointer ' Индекс в таблице объектов
hash As Integer ' Хэш
hash As Integer ' Хэш
Index As Integer ' Индекс
Index As Integer ' Индекс
End Type
End Type
Private Type tElement ' Колонка хэш таблицы
Private Type tElement ' Колонка хэш таблицы
Key As Variant ' Ключ
Key As Variant ' Ключ
value As Variant ' Значение
value As Variant ' Значение
Next As tPointer ' Индекс следующего элемента
Next As tPointer ' Индекс следующего элемента
Prev As tPointer ' Индекс предыдущего элемента
Prev As tPointer ' Индекс предыдущего элемента
End Type
End Type
Private Type tItem ' Строка хэш таблицы
Private Type tItem ' Строка хэш таблицы
ElementsCount As Long ' Количество коллизий+1
ElementsCount As Long ' Количество коллизий+1
Elements() As tElement ' Элементы
Elements() As tElement ' Элементы
End Type
End Type
Private Type enumObject ' Объект-перечислитель
Private Type enumObject ' Объект-перечислитель
vTablePtr As Long ' Указатель на интерфейс IEnumVariant
vTablePtr As Long ' Указатель на интерфейс IEnumVariant
Counter As Long ' Счетчик ссылок
Counter As Long ' Счетчик ссылок
Pointer As tPointer ' Индекс на текущий элемент
Pointer As tPointer ' Индекс на текущий элемент
DataPtr As Long ' Указатель на List
DataPtr As Long ' Указатель на List
First As tPointer ' Индекс на первый элемент
First As tPointer ' Индекс на первый элемент
OffsetVariant As Long ' Смещение перечисляемой переменной (key/value)
OffsetVariant As Long ' Смещение перечисляемой переменной (key/value)
End Type
End Type
Private List() As tItem ' Таблица
Private List() As tItem ' Таблица
Private mEnumMode As EnumMethod ' Текущий режим перечисления
Private mEnumMode As EnumMethod ' Текущий режим перечисления
Private mCount As Long ' Кол-во элементов
Private mCount As Long ' Кол-во элементов
Private mCompareMode As VbCompareMethod ' Режим сравнения ключей
Private mCompareMode As VbCompareMethod ' Режим сравнения ключей
Private First As tPointer ' Индекс первого элемента
Private First As tPointer ' Индекс первого элемента
Private Last As tPointer ' Индекс последнего элемента
Private Last As tPointer ' Индекс последнего элемента
Private locbuf() As Integer ' Буфер текстовой строки
Private locbuf() As Integer ' Буфер текстовой строки
Private lpAsm As Long
Private lpAsm As Long
Private lcid As Long
Private lcid As Long
Private decMin As Variant
Private decMin As Variant
Private decMax As Variant
Private decMax As Variant
' // Получить перечислитель
' // Получить перечислитель
Public Property Get NewEnum() As IUnknown
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"
Attribute NewEnum.VB_MemberFlags = "40"
Dim enumObject As Long
Dim enumObject As Long
enumObject = CreateEnumObject()
enumObject = CreateEnumObject()
If enumObject = 0 Then Exit Function
If enumObject = 0 Then Exit Function
GetMem4 enumObject, ByVal NewEnum
GetMem4 enumObject, ByVal NewEnum
End Property
End Property
' // Получает/Устанавливает режим перечислителя
' // Получает/Устанавливает режим перечислителя
Public Property Get EnumMode() As EnumMethod
Public Property Get EnumMode() As EnumMethod
Attribute EnumMode.VB_Description = "Определяет режим сравнения в циклах For Each."
Attribute EnumMode.VB_Description = "Определяет режим сравнения в циклах For Each."
EnumMode = mEnumMode
EnumMode = mEnumMode
End Property
End Property
Public Property Let EnumMode(ByVal value As EnumMethod)
Public Property Let EnumMode(ByVal value As EnumMethod)
mEnumMode = value
mEnumMode = value
End Property
End Property
' // Получает/Устанавливает режим сравнения ключей
' // Получает/Устанавливает режим сравнения ключей
Public Property Get CompareMode() As CompareMethod
Public Property Get CompareMode() As CompareMethod
Attribute CompareMode.VB_Description = "Установить или получить метод сравнения строк.\n"
Attribute CompareMode.VB_Description = "Установить или получить метод сравнения строк.\n"
CompareMode = mCompareMode
CompareMode = mCompareMode
End Property
End Property
Public Property Let CompareMode(ByVal value As CompareMethod)
Public Property Let CompareMode(ByVal value As CompareMethod)
If mCount Then Err.Raise 5: Exit Property ' Только когда элементов нет
If mCount Then Err.Raise 5: Exit Property ' Только когда элементов нет
mCompareMode = value
mCompareMode = value
End Property
End Property
' // Добавить элемент
' // Добавить элемент
Public Sub Add(Key As Variant, value As Variant)
Public Sub Add(Key As Variant, value As Variant)
Attribute Add.VB_Description = "Добавить в таблицу новый ключ и элемент.\n"
Attribute Add.VB_Description = "Добавить в таблицу новый ключ и элемент.\n"
Dim pt As tPointer
Dim pt As tPointer
If Not GetFromKey(Key, pt) Then
If Not GetFromKey(Key, pt) Then
Err.Raise 5
Err.Raise 5
Exit Sub
Exit Sub
End If
End If
If pt.Index <> -1 Then
If pt.Index <> -1 Then
Err.Raise 457
Err.Raise 457
Exit Sub
Exit Sub
End If
End If
pt.Index = List(pt.hash).ElementsCount
pt.Index = List(pt.hash).ElementsCount
Add_ pt, Key, value
Add_ pt, Key, value
End Sub
End Sub
' // Возвратить элемент с заданным ключом
' // Возвратить элемент с заданным ключом
Public Property Get Item(Key As Variant) As Variant
Public Property Get Item(Key As Variant) As Variant
Attribute Item.VB_Description = "Задать или извлечь элемент по заданному ключу\n"
Attribute Item.VB_Description = "Задать или извлечь элемент по заданному ключу\n"