Untitled diff

Created Diff never expires
2 removals
759 lines
5 additions
760 lines
VERSION 1.0 CLASS
VERSION 1.0 CLASS
BEGIN
BEGIN
MultiUse = -1 'True
MultiUse = -1 'True
Persistable = 0 'NotPersistable
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
MTSTransactionMode = 0 'NotAnMTSObject
END
END
Attribute VB_Name = "clsTrickHashTable"
Attribute VB_Name = "clsTrickHashTable"
Attribute VB_GlobalNameSpace = False
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_Exposed = False
' clsTrickHashTable.cls - класс хеш-таблицы
' clsTrickHashTable.cls - класс хеш-таблицы
' © Кривоус Анатолий Анатольевич (The trick), 2014
' © Кривоус Анатолий Анатольевич (The trick), 2014


Option Explicit
Option Explicit


Public Enum CompareMethod ' Метод сравнения
Public Enum CompareMethod ' Метод сравнения
BinaryCompare
BinaryCompare
TextCompare
TextCompare
End Enum
End Enum


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