\doxysection{hash\+\_\+table.\+h} \hypertarget{hash__table_8h_source}{}\label{hash__table_8h_source} \begin{DoxyCode}{0} \DoxyCodeLine{00001\ \textcolor{comment}{//\ =====================================================================================================================}} \DoxyCodeLine{00002\ \textcolor{comment}{//\ \ open-\/cpp-\/utils,\ an\ open-\/source\ cpp\ library\ with\ data\ structures\ that\ extend\ the\ STL.}} \DoxyCodeLine{00003\ \textcolor{comment}{//\ \ Copyright\ (C)\ 2024\ \ Medusa\ Slockbower}} \DoxyCodeLine{00004\ \textcolor{comment}{//}} \DoxyCodeLine{00005\ \textcolor{comment}{//\ \ This\ program\ is\ free\ software:\ you\ can\ redistribute\ it\ and/or\ modify}} \DoxyCodeLine{00006\ \textcolor{comment}{//\ \ it\ under\ the\ terms\ of\ the\ GNU\ General\ Public\ License\ as\ published\ by}} \DoxyCodeLine{00007\ \textcolor{comment}{//\ \ the\ Free\ Software\ Foundation,\ either\ version\ 3\ of\ the\ License,\ or}} \DoxyCodeLine{00008\ \textcolor{comment}{//\ \ (at\ your\ option)\ any\ later\ version.}} \DoxyCodeLine{00009\ \textcolor{comment}{//}} \DoxyCodeLine{00010\ \textcolor{comment}{//\ \ This\ program\ is\ distributed\ in\ the\ hope\ that\ it\ will\ be\ useful,}} \DoxyCodeLine{00011\ \textcolor{comment}{//\ \ but\ WITHOUT\ ANY\ WARRANTY;\ without\ even\ the\ implied\ warranty\ of}} \DoxyCodeLine{00012\ \textcolor{comment}{//\ \ MERCHANTABILITY\ or\ FITNESS\ FOR\ A\ PARTICULAR\ PURPOSE.\ \ See\ the}} \DoxyCodeLine{00013\ \textcolor{comment}{//\ \ GNU\ General\ Public\ License\ for\ more\ details.}} \DoxyCodeLine{00014\ \textcolor{comment}{//}} \DoxyCodeLine{00015\ \textcolor{comment}{//\ \ You\ should\ have\ received\ a\ copy\ of\ the\ GNU\ General\ Public\ License}} \DoxyCodeLine{00016\ \textcolor{comment}{//\ \ along\ with\ this\ program.\ \ If\ not,\ see\ .}} \DoxyCodeLine{00017\ \textcolor{comment}{//\ =====================================================================================================================}} \DoxyCodeLine{00018\ } \DoxyCodeLine{00019\ \textcolor{preprocessor}{\#ifndef\ OPEN\_CPP\_UTILS\_HASH\_TABLE\_H}} \DoxyCodeLine{00020\ \textcolor{preprocessor}{\#define\ OPEN\_CPP\_UTILS\_HASH\_TABLE\_H}} \DoxyCodeLine{00021\ } \DoxyCodeLine{00022\ \textcolor{preprocessor}{\#include\ }} \DoxyCodeLine{00023\ \textcolor{preprocessor}{\#include\ }} \DoxyCodeLine{00024\ \textcolor{preprocessor}{\#include\ }} \DoxyCodeLine{00025\ \textcolor{preprocessor}{\#include\ }} \DoxyCodeLine{00026\ } \DoxyCodeLine{00027\ \textcolor{preprocessor}{\#include\ "{}math.h"{}}} \DoxyCodeLine{00028\ \textcolor{preprocessor}{\#include\ "{}optional.h"{}}} \DoxyCodeLine{00029\ } \DoxyCodeLine{00030\ \textcolor{keyword}{namespace\ }open\_cpp\_utils} \DoxyCodeLine{00031\ \{} \DoxyCodeLine{00032\ } \DoxyCodeLine{00033\ \textcolor{keyword}{template}<\textcolor{keyword}{typename}\ T,\ \textcolor{keyword}{class}\ Hash\ =\ std::hash,\ \textcolor{keyword}{class}\ Alloc\ =\ std::allocator>} \DoxyCodeLine{00034\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classopen__cpp__utils_1_1hash__table}{hash\_table}}} \DoxyCodeLine{00035\ \{} \DoxyCodeLine{00036\ \textcolor{comment}{//\ Typedefs\ ============================================================================================================}} \DoxyCodeLine{00037\ } \DoxyCodeLine{00038\ \textcolor{keyword}{public}:} \DoxyCodeLine{00039\ \ \ \ \ \textcolor{keyword}{friend}\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}};} \DoxyCodeLine{00040\ } \DoxyCodeLine{00041\ \textcolor{keyword}{private}:} \DoxyCodeLine{00042\ \ \ \ \ \textcolor{keyword}{struct\ }\_Node;} \DoxyCodeLine{00043\ } \DoxyCodeLine{00044\ \textcolor{keyword}{public}:} \DoxyCodeLine{00045\ \ \ \ \ \textcolor{keyword}{using\ }value\_type\ \ \ \ \ \ =\ T;} \DoxyCodeLine{00046\ \ \ \ \ \textcolor{keyword}{using\ }pointer\ \ \ \ \ \ \ \ \ =\ T*;} \DoxyCodeLine{00047\ \ \ \ \ \textcolor{keyword}{using\ }const\_pointer\ \ \ =\ \textcolor{keyword}{const}\ T*;} \DoxyCodeLine{00048\ \ \ \ \ \textcolor{keyword}{using\ }reference\ \ \ \ \ \ \ =\ T\&;} \DoxyCodeLine{00049\ \ \ \ \ \textcolor{keyword}{using\ }const\_reference\ =\ \textcolor{keyword}{const}\ T\&;} \DoxyCodeLine{00050\ } \DoxyCodeLine{00051\ \ \ \ \ \textcolor{keyword}{using\ }hash\_type\ \ \ \ \ \ \ =\ Hash;} \DoxyCodeLine{00052\ \ \ \ \ \textcolor{keyword}{using\ }allocator\_type\ \ =\ \textcolor{keyword}{typename}\ std::allocator\_traits::template\ rebind\_alloc<\_Node>;} \DoxyCodeLine{00053\ } \DoxyCodeLine{00054\ \ \ \ \ \textcolor{keyword}{using\ }size\_type\ \ \ \ \ \ \ =\ size\_t;} \DoxyCodeLine{00055\ \ \ \ \ \textcolor{keyword}{using\ }iterator\_type\ \ \ =\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}};} \DoxyCodeLine{00056\ } \DoxyCodeLine{00057\ \textcolor{keyword}{private}:} \DoxyCodeLine{00058\ \ \ \ \ \textcolor{keyword}{using\ }table\_type\ =\ \_Node*;} \DoxyCodeLine{00059\ \ \ \ \ \textcolor{keyword}{using\ }node\ \ \ \ \ \ \ =\ int64\_t;} \DoxyCodeLine{00060\ \ \ \ \ \textcolor{keyword}{static}\ \textcolor{keyword}{constexpr}\ node\ nullnode\ =\ std::integral\_constant\{\};} \DoxyCodeLine{00061\ } \DoxyCodeLine{00062\ } \DoxyCodeLine{00063\ \textcolor{comment}{//\ Structs\ =============================================================================================================}} \DoxyCodeLine{00064\ } \DoxyCodeLine{00065\ \textcolor{keyword}{private}:} \DoxyCodeLine{00066\ \ \ \ \ \textcolor{keyword}{struct\ }\_Node} \DoxyCodeLine{00067\ \ \ \ \ \{} \DoxyCodeLine{00068\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1optional}{optional}}\ value;} \DoxyCodeLine{00069\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ \ \ \ \ \ \ \ \ psl;} \DoxyCodeLine{00070\ } \DoxyCodeLine{00071\ \ \ \ \ \ \ \ \ \_Node()\ :\ value(),\ psl(0)\ \{\ \}} \DoxyCodeLine{00072\ \ \ \ \ \ \ \ \ \_Node(const\_reference\ v)\ :\ value(v),\ psl(0)\ \{\ \}} \DoxyCodeLine{00073\ \ \ \ \ \ \ \ \ \_Node(const\_reference\ v,\ \textcolor{keywordtype}{int}\ psl)\ :\ value(v),\ psl(psl)\ \{\ \}} \DoxyCodeLine{00074\ } \DoxyCodeLine{00075\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{bool}\ operator==(\textcolor{keyword}{const}\ \_Node\&\ b)\textcolor{keyword}{\ const}} \DoxyCodeLine{00076\ \textcolor{keyword}{\ \ \ \ \ \ \ \ }\{} \DoxyCodeLine{00077\ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ value\ ==\ b.value\ \&\&\ psl\ ==\ b.psl;} \DoxyCodeLine{00078\ \ \ \ \ \ \ \ \ \}} \DoxyCodeLine{00079\ \ \ \ \ \};} \DoxyCodeLine{00080\ } \DoxyCodeLine{00081\ } \DoxyCodeLine{00082\ \ \ \ \ \textcolor{comment}{//\ Iterators\ ===========================================================================================================}} \DoxyCodeLine{00083\ } \DoxyCodeLine{00084\ \textcolor{keyword}{public}:} \DoxyCodeLine{00085\ \ \ \ \ \textcolor{keyword}{class\ }\mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}} \DoxyCodeLine{00086\ \ \ \ \ \{} \DoxyCodeLine{00087\ \ \ \ \ \textcolor{keyword}{public}:} \DoxyCodeLine{00088\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}(\mbox{\hyperlink{classopen__cpp__utils_1_1hash__table}{hash\_table}}*\ table,\ size\_type\ idx)\ :\ table\_(table),\ idx\_(idx)\ \{\ \_next\_index();\ \}} \DoxyCodeLine{00089\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}(\textcolor{keyword}{const}\ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}\&\ b)\ :\ table\_(b.table\_),\ idx\_(b.idx\_)\ \{\ \}} \DoxyCodeLine{00090\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}(\mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}\&\&\ b)\ noexcept\ :\ table\_(b.table\_),\ idx\_(b.idx\_)\ \{\ \}} \DoxyCodeLine{00091\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{\string~iterator}}()\ =\ \textcolor{keywordflow}{default};} \DoxyCodeLine{00092\ } \DoxyCodeLine{00093\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}\&\ operator=(\textcolor{keyword}{const}\ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}\&\ b)\ \ \ \ \ \{\ \textcolor{keywordflow}{if}(\&b\ ==\ \textcolor{keyword}{this})\ \textcolor{keywordflow}{return}\ *\textcolor{keyword}{this};\ table\_\ =\ b.table\_;\ idx\_\ =\ b.idx\_;\ \textcolor{keywordflow}{return}\ *\textcolor{keyword}{this};\ \}} \DoxyCodeLine{00094\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}\&\ operator=(\mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}\&\&\ b)\ \textcolor{keyword}{noexcept}\ \{\ \textcolor{keywordflow}{if}(\&b\ ==\ \textcolor{keyword}{this})\ \textcolor{keywordflow}{return}\ *\textcolor{keyword}{this};\ table\_\ =\ b.table\_;\ idx\_\ =\ b.idx\_;\ \textcolor{keywordflow}{return}\ *\textcolor{keyword}{this};\ \};} \DoxyCodeLine{00095\ } \DoxyCodeLine{00096\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}\&\ operator++()\ \{\ ++idx\_;\ \_next\_index();\ \textcolor{keywordflow}{return}\ *\textcolor{keyword}{this};\ \}} \DoxyCodeLine{00097\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}\ \ operator++(\textcolor{keywordtype}{int})\ \{\ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}\ ret\ =\ *\textcolor{keyword}{this};\ ++idx\_;\ \_next\_index();\ \textcolor{keywordflow}{return}\ ret;\ \}} \DoxyCodeLine{00098\ } \DoxyCodeLine{00099\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{bool}\ operator==(\textcolor{keyword}{const}\ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}\&\ o)\ \textcolor{keyword}{const}\ =\ \textcolor{keywordflow}{default};} \DoxyCodeLine{00100\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{bool}\ operator!=(\textcolor{keyword}{const}\ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}\&\ o)\ \textcolor{keyword}{const}\ =\ \textcolor{keywordflow}{default};} \DoxyCodeLine{00101\ } \DoxyCodeLine{00102\ \ \ \ \ \ \ \ \ reference\ operator*()\ \ \{\ \textcolor{keywordflow}{return}\ table\_-\/>table\_[idx\_].value;\ \}} \DoxyCodeLine{00103\ \ \ \ \ \ \ \ \ pointer\ \ \ operator-\/>()\ \{\ \textcolor{keywordflow}{return}\ \&*table\_-\/>table\_[idx\_].value;\ \}} \DoxyCodeLine{00104\ \ \ \ \ \ \ \ \ } \DoxyCodeLine{00105\ \ \ \ \ \ \ \ \ const\_reference\ operator*()\textcolor{keyword}{\ \ const\ }\{\ \textcolor{keywordflow}{return}\ table\_-\/>table\_[idx\_].value;\ \}} \DoxyCodeLine{00106\ \ \ \ \ \ \ \ \ const\_pointer\ \ \ operator-\/>()\textcolor{keyword}{\ const\ }\{\ \textcolor{keywordflow}{return}\ \&*table\_-\/>table\_[idx\_].value;\ \}} \DoxyCodeLine{00107\ } \DoxyCodeLine{00108\ \ \ \ \ \textcolor{keyword}{private}:} \DoxyCodeLine{00109\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ \_next\_index()} \DoxyCodeLine{00110\ \ \ \ \ \ \ \ \ \{} \DoxyCodeLine{00111\ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{while}(idx\_\ <\ table\_-\/>capacity\_\ \&\&\ not\ table\_-\/>table\_[idx\_].value())} \DoxyCodeLine{00112\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ++idx\_;} \DoxyCodeLine{00113\ \ \ \ \ \ \ \ \ \}} \DoxyCodeLine{00114\ } \DoxyCodeLine{00115\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table}{hash\_table}}*\ table\_;} \DoxyCodeLine{00116\ \ \ \ \ \ \ \ \ size\_type\ \ \ idx\_;} \DoxyCodeLine{00117\ \ \ \ \ \};} \DoxyCodeLine{00118\ \ \ \ \ } \DoxyCodeLine{00119\ \ \ \ \ \textcolor{keyword}{class\ }\mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{const\_iterator}}} \DoxyCodeLine{00120\ \ \ \ \ \{} \DoxyCodeLine{00121\ \ \ \ \ \textcolor{keyword}{public}:} \DoxyCodeLine{00122\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{const\_iterator}}(\textcolor{keyword}{const}\ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table}{hash\_table}}*\ table,\ node\ idx)\ :\ table\_(table),\ idx\_(idx)\ \{\ \_next\_index();\ \}} \DoxyCodeLine{00123\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{const\_iterator}}(\textcolor{keyword}{const}\ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{const\_iterator}}\&\ b)\ :\ table\_(b.table\_),\ idx\_(b.idx\_)\ \{\ \}} \DoxyCodeLine{00124\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{const\_iterator}}(\mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{const\_iterator}}\&\&\ b)\ noexcept\ :\ table\_(b.table\_),\ idx\_(b.idx\_)\ \{\ \}} \DoxyCodeLine{00125\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{\string~const\_iterator}}()\ =\ \textcolor{keywordflow}{default};} \DoxyCodeLine{00126\ } \DoxyCodeLine{00127\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{const\_iterator}}\&\ operator=(\textcolor{keyword}{const}\ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{const\_iterator}}\&\ b)\ \ \ \ \ \{\ \textcolor{keywordflow}{if}(\&b\ ==\ \textcolor{keyword}{this})\ \textcolor{keywordflow}{return}\ *\textcolor{keyword}{this};\ table\_\ =\ b.table\_;\ idx\_\ =\ b.idx\_;\ \textcolor{keywordflow}{return}\ *\textcolor{keyword}{this};\ \}} \DoxyCodeLine{00128\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{const\_iterator}}\&\ operator=(\mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{const\_iterator}}\&\&\ b)\ \textcolor{keyword}{noexcept}\ \{\ \textcolor{keywordflow}{if}(\&b\ ==\ \textcolor{keyword}{this})\ \textcolor{keywordflow}{return}\ *\textcolor{keyword}{this};\ table\_\ =\ b.table\_;\ idx\_\ =\ b.idx\_;\ \textcolor{keywordflow}{return}\ *\textcolor{keyword}{this};\ \};} \DoxyCodeLine{00129\ } \DoxyCodeLine{00130\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{const\_iterator}}\&\ operator++()\ \{\ ++idx\_;\ \_next\_index();\ \textcolor{keywordflow}{return}\ *\textcolor{keyword}{this};\ \}} \DoxyCodeLine{00131\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{const\_iterator}}\ \ operator++(\textcolor{keywordtype}{int})\ \{\ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{const\_iterator}}\ ret\ =\ *\textcolor{keyword}{this};\ ++idx\_;\ \_next\_index();\ \textcolor{keywordflow}{return}\ ret;\ \}} \DoxyCodeLine{00132\ } \DoxyCodeLine{00133\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{bool}\ operator==(\textcolor{keyword}{const}\ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{const\_iterator}}\&\ o)\ \textcolor{keyword}{const}\ =\ \textcolor{keywordflow}{default};} \DoxyCodeLine{00134\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{bool}\ operator!=(\textcolor{keyword}{const}\ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1const__iterator}{const\_iterator}}\&\ o)\ \textcolor{keyword}{const}\ =\ \textcolor{keywordflow}{default};} \DoxyCodeLine{00135\ } \DoxyCodeLine{00136\ \ \ \ \ \ \ \ \ reference\ operator*()\textcolor{keyword}{\ \ const\ }\{\ \textcolor{keywordflow}{return}\ \ table\_-\/>table\_[idx\_].value;\ \}} \DoxyCodeLine{00137\ \ \ \ \ \ \ \ \ pointer\ \ \ operator-\/>()\textcolor{keyword}{\ const\ }\{\ \textcolor{keywordflow}{return}\ \&*table\_-\/>table\_[idx\_].value;\ \}} \DoxyCodeLine{00138\ } \DoxyCodeLine{00139\ \ \ \ \ \textcolor{keyword}{private}:} \DoxyCodeLine{00140\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ \_next\_index()\ \{\ \textcolor{keywordflow}{while}(idx\_\ <\ table\_-\/>capacity\_\ \&\&\ not\ table\_-\/>table\_[idx\_].value())\ ++idx\_;\ \}} \DoxyCodeLine{00141\ } \DoxyCodeLine{00142\ \ \ \ \ \ \ \ \ \textcolor{keyword}{const}\ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table}{hash\_table}}*\ table\_;} \DoxyCodeLine{00143\ \ \ \ \ \ \ \ \ node\ \ \ \ \ \ \ \ idx\_;} \DoxyCodeLine{00144\ \ \ \ \ \};} \DoxyCodeLine{00145\ } \DoxyCodeLine{00146\ \ \ \ \ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}\ begin()\ \{\ \textcolor{keywordflow}{return}\ \mbox{\hyperlink{classopen__cpp__utils_1_1hash__table_1_1iterator}{iterator}}(\textcolor{keyword}{this},\ 0);\ \ \ \ \ \ \ \ \}} \DoxyCodeLine{00147\ \ \ \ \ iterator\ end()\ \ \ \{\ \textcolor{keywordflow}{return}\ iterator(\textcolor{keyword}{this},\ capacity\_);\ \}} \DoxyCodeLine{00148\ } \DoxyCodeLine{00149\ \ \ \ \ const\_iterator\ begin()\textcolor{keyword}{\ const\ }\{\ \textcolor{keywordflow}{return}\ const\_iterator(\textcolor{keyword}{this},\ 0);\ \}} \DoxyCodeLine{00150\ \ \ \ \ const\_iterator\ end()\textcolor{keyword}{\ const\ }\{\ \textcolor{keywordflow}{return}\ const\_iterator(\textcolor{keyword}{this},\ capacity\_);\ \}} \DoxyCodeLine{00151\ } \DoxyCodeLine{00152\ } \DoxyCodeLine{00153\ \textcolor{comment}{//\ Functions\ ===========================================================================================================}} \DoxyCodeLine{00154\ } \DoxyCodeLine{00155\ \textcolor{keyword}{public}:} \DoxyCodeLine{00156\ } \DoxyCodeLine{00157\ \textcolor{comment}{//\ Constructors\ \&\ Destructor\ -\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/}} \DoxyCodeLine{00158\ } \DoxyCodeLine{00159\ \ \ \ \ hash\_table()\ :\ table\_(nullptr),\ capacity\_(0),\ size\_(0),\ load\_factor\_(0.8),\ hash\_(),\ alloc\_()\ \{\ \}} \DoxyCodeLine{00160\ \ \ \ \ hash\_table(std::initializer\_list\ data);} \DoxyCodeLine{00161\ \ \ \ \ hash\_table(\textcolor{keyword}{const}\ hash\_table\&);} \DoxyCodeLine{00162\ \ \ \ \ hash\_table(hash\_table\&\&)\ =\ \textcolor{keywordflow}{default};\ \textcolor{comment}{//\ Default\ Move\ Constructor\ should\ suffice}} \DoxyCodeLine{00163\ \ \ \ \ \string~hash\_table()\ \{\ clear();\ \}} \DoxyCodeLine{00164\ } \DoxyCodeLine{00165\ \textcolor{comment}{//\ Modifiers\ -\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/}} \DoxyCodeLine{00166\ } \DoxyCodeLine{00167\ \ \ \ \ \textcolor{keywordtype}{void}\ reserve(\textcolor{keywordtype}{size\_t}\ size);} \DoxyCodeLine{00168\ \ \ \ \ \textcolor{keywordtype}{void}\ clear();} \DoxyCodeLine{00169\ \ \ \ \ \textcolor{keywordtype}{void}\ insert(const\_reference\ x);} \DoxyCodeLine{00170\ \ \ \ \ \textcolor{keywordtype}{void}\ erase(const\_reference\ x);} \DoxyCodeLine{00171\ \ \ \ \ \textcolor{keywordtype}{bool}\ contains(const\_reference\ x);} \DoxyCodeLine{00172\ \ \ \ \ } \DoxyCodeLine{00173\ \ \ \ \ iterator\ find(const\_reference\ x)} \DoxyCodeLine{00174\ \ \ \ \ \{} \DoxyCodeLine{00175\ \ \ \ \ \ \ \ \ node\ res\ =\ \_find(x);} \DoxyCodeLine{00176\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(res\ ==\ nullnode)\ res\ =\ capacity\_;} \DoxyCodeLine{00177\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ iterator(\textcolor{keyword}{this},\ res);} \DoxyCodeLine{00178\ \ \ \ \ \}} \DoxyCodeLine{00179\ \ \ \ \ } \DoxyCodeLine{00180\ \ \ \ \ const\_iterator\ find(const\_reference\ x)\textcolor{keyword}{\ const}} \DoxyCodeLine{00181\ \textcolor{keyword}{\ \ \ \ }\{} \DoxyCodeLine{00182\ \ \ \ \ \ \ \ \ node\ res\ =\ \_find(x);} \DoxyCodeLine{00183\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(res\ ==\ nullnode)\ res\ =\ capacity\_;} \DoxyCodeLine{00184\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ const\_iterator(\textcolor{keyword}{this},\ res);} \DoxyCodeLine{00185\ \ \ \ \ \}} \DoxyCodeLine{00186\ } \DoxyCodeLine{00187\ \textcolor{comment}{//\ Size\ -\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/}} \DoxyCodeLine{00188\ } \DoxyCodeLine{00189\ \ \ \ \ [[nodiscard]]\ size\_type\ capacity()\textcolor{keyword}{\ \ const\ }\{\ \textcolor{keywordflow}{return}\ capacity\_;\ \}} \DoxyCodeLine{00190\ \ \ \ \ [[nodiscard]]\ size\_type\ size()\textcolor{keyword}{\ \ \ \ \ \ const\ }\{\ \textcolor{keywordflow}{return}\ size\_;\ \}} \DoxyCodeLine{00191\ \ \ \ \ [[nodiscard]]\ \textcolor{keywordtype}{bool}\ \ \ \ \ \ empty()\textcolor{keyword}{\ \ \ \ \ const\ }\{\ \textcolor{keywordflow}{return}\ size\_\ ==\ 0;\ \}} \DoxyCodeLine{00192\ \ \ \ \ [[nodiscard]]\ \textcolor{keywordtype}{double}\ \ \ \ occupancy()\textcolor{keyword}{\ const\ }\{\ \textcolor{keywordflow}{return}\ size\_\ /\ \textcolor{keyword}{static\_cast<}\textcolor{keywordtype}{double}\textcolor{keyword}{>}(capacity\_);\ \}} \DoxyCodeLine{00193\ } \DoxyCodeLine{00194\ \textcolor{comment}{//\ Helpers\ -\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/-\/}} \DoxyCodeLine{00195\ } \DoxyCodeLine{00196\ \textcolor{keyword}{private}:} \DoxyCodeLine{00197\ \ \ \ \ \textcolor{keywordtype}{void}\ \_increase\_capacity();} \DoxyCodeLine{00198\ } \DoxyCodeLine{00199\ \ \ \ \ [[nodiscard]]\ node\ \_hash(const\_reference\ v)\ \textcolor{keyword}{const};} \DoxyCodeLine{00200\ \ \ \ \ [[nodiscard]]\ node\ \_find(const\_reference\ x)\ \textcolor{keyword}{const};} \DoxyCodeLine{00201\ \ \ \ \ [[nodiscard]]\ node\ \_next(node\ n)\textcolor{keyword}{\ \ \ \ \ \ \ \ \ \ \ \ const\ }\{\ \textcolor{keywordflow}{return}\ (n\ +\ 1)\ \ \ \ \ \ \ \ \ \ \ \ \ \%\ capacity\_;\ \}} \DoxyCodeLine{00202\ \ \ \ \ [[nodiscard]]\ node\ \_prev(node\ n)\textcolor{keyword}{\ \ \ \ \ \ \ \ \ \ \ \ const\ }\{\ \textcolor{keywordflow}{return}\ (n\ -\/\ 1\ +\ capacity\_)\ \%\ capacity\_;\ \}} \DoxyCodeLine{00203\ } \DoxyCodeLine{00204\ \ \ \ \ \textcolor{keyword}{static}\ size\_type\ \_next\_prime(size\_type\ x);} \DoxyCodeLine{00205\ \ \ \ \ \textcolor{keyword}{static}\ size\_type\ \_prev\_prime(size\_type\ x);} \DoxyCodeLine{00206\ } \DoxyCodeLine{00207\ } \DoxyCodeLine{00208\ \textcolor{comment}{//\ Variables\ ===========================================================================================================}} \DoxyCodeLine{00209\ } \DoxyCodeLine{00210\ \textcolor{keyword}{private}:} \DoxyCodeLine{00211\ \ \ \ \ table\_type\ \ \ \ \ table\_;} \DoxyCodeLine{00212\ \ \ \ \ size\_type\ \ \ \ \ \ capacity\_,\ size\_;} \DoxyCodeLine{00213\ \ \ \ \ \textcolor{keywordtype}{double}\ \ \ \ \ \ \ \ \ load\_factor\_;} \DoxyCodeLine{00214\ \ \ \ \ hash\_type\ \ \ \ \ \ hash\_;} \DoxyCodeLine{00215\ \ \ \ \ allocator\_type\ alloc\_;} \DoxyCodeLine{00216\ \};} \DoxyCodeLine{00217\ } \DoxyCodeLine{00218\ \textcolor{keyword}{template}<\textcolor{keyword}{typename}\ T,\ \textcolor{keyword}{class}\ Hash,\ \textcolor{keyword}{class}\ Alloc>} \DoxyCodeLine{00219\ hash\_table::hash\_table(std::initializer\_list\ data)} \DoxyCodeLine{00220\ \ \ \ \ :\ hash\_table()} \DoxyCodeLine{00221\ \{} \DoxyCodeLine{00222\ \ \ \ \ reserve(data.size());} \DoxyCodeLine{00223\ \ \ \ \ \textcolor{keywordflow}{for}(value\_type\ val\ :\ data)\ \{\ insert(val);\ \}} \DoxyCodeLine{00224\ \}} \DoxyCodeLine{00225\ } \DoxyCodeLine{00226\ \textcolor{keyword}{template}<\textcolor{keyword}{typename}\ T,\ \textcolor{keyword}{class}\ Hash,\ \textcolor{keyword}{class}\ Alloc>} \DoxyCodeLine{00227\ hash\_table::hash\_table(\textcolor{keyword}{const}\ hash\_table\&\ other)} \DoxyCodeLine{00228\ \ \ \ \ :\ table\_(nullptr)} \DoxyCodeLine{00229\ \ \ \ \ ,\ capacity\_(other.capacity\_)} \DoxyCodeLine{00230\ \ \ \ \ ,\ size\_(other.size\_)} \DoxyCodeLine{00231\ \ \ \ \ ,\ load\_factor\_(0.8)} \DoxyCodeLine{00232\ \{} \DoxyCodeLine{00233\ } \DoxyCodeLine{00234\ \}} \DoxyCodeLine{00235\ } \DoxyCodeLine{00236\ \textcolor{keyword}{template}<\textcolor{keyword}{typename}\ T,\ \textcolor{keyword}{class}\ Hash,\ \textcolor{keyword}{class}\ Alloc>} \DoxyCodeLine{00237\ \textcolor{keywordtype}{void}\ hash\_table::reserve(\textcolor{keywordtype}{size\_t}\ size)} \DoxyCodeLine{00238\ \{} \DoxyCodeLine{00239\ \ \ \ \ table\_type\ old\ =\ table\_;} \DoxyCodeLine{00240\ \ \ \ \ size\_type\ \ old\_capacity\ =\ capacity\_;} \DoxyCodeLine{00241\ \ \ \ \ capacity\_\ =\ \_next\_prime(size);} \DoxyCodeLine{00242\ \ \ \ \ table\_\ \ \ \ =\ alloc\_.allocate(capacity\_);} \DoxyCodeLine{00243\ \ \ \ \ memset(table\_,\ 0,\ capacity\_\ *\ \textcolor{keyword}{sizeof}(\_Node));} \DoxyCodeLine{00244\ \ \ \ \ size\_\ =\ 0;} \DoxyCodeLine{00245\ } \DoxyCodeLine{00246\ \ \ \ \ \textcolor{keywordflow}{for}(size\_type\ i\ =\ 0;\ i\ <\ old\_capacity;\ ++i)} \DoxyCodeLine{00247\ \ \ \ \ \{} \DoxyCodeLine{00248\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(old[i].value())\ insert(old[i].value);} \DoxyCodeLine{00249\ \ \ \ \ \}} \DoxyCodeLine{00250\ } \DoxyCodeLine{00251\ \ \ \ \ alloc\_.deallocate(old,\ old\_capacity);} \DoxyCodeLine{00252\ \}} \DoxyCodeLine{00253\ } \DoxyCodeLine{00254\ \textcolor{keyword}{template}<\textcolor{keyword}{typename}\ T,\ \textcolor{keyword}{class}\ Hash,\ \textcolor{keyword}{class}\ Alloc>} \DoxyCodeLine{00255\ \textcolor{keywordtype}{void}\ hash\_table::clear()} \DoxyCodeLine{00256\ \{} \DoxyCodeLine{00257\ \ \ \ \ alloc\_.deallocate(table\_,\ capacity\_);} \DoxyCodeLine{00258\ \ \ \ \ capacity\_\ =\ size\_\ =\ 0;} \DoxyCodeLine{00259\ \ \ \ \ table\_\ =\ \textcolor{keyword}{nullptr};} \DoxyCodeLine{00260\ \}} \DoxyCodeLine{00261\ } \DoxyCodeLine{00262\ \textcolor{keyword}{template}<\textcolor{keyword}{typename}\ T,\ \textcolor{keyword}{class}\ Hash,\ \textcolor{keyword}{class}\ Alloc>} \DoxyCodeLine{00263\ \textcolor{keywordtype}{void}\ hash\_table::insert(const\_reference\ x)} \DoxyCodeLine{00264\ \{} \DoxyCodeLine{00265\ \ \ \ \ \textcolor{keywordflow}{if}(occupancy()\ >\ load\_factor\_\ ||\ capacity\_\ ==\ 0)\ \_increase\_capacity();} \DoxyCodeLine{00266\ } \DoxyCodeLine{00267\ \ \ \ \ node\ idx\ =\ \_hash(x);} \DoxyCodeLine{00268\ \ \ \ \ \textcolor{keywordtype}{int}\ \ psl\ =\ 0;} \DoxyCodeLine{00269\ \ \ \ \ T\ \ \ \ val\ =\ x;} \DoxyCodeLine{00270\ } \DoxyCodeLine{00271\ \ \ \ \ \textcolor{keywordflow}{while}(table\_[idx].value())} \DoxyCodeLine{00272\ \ \ \ \ \{} \DoxyCodeLine{00273\ \ \ \ \ \ \ \ \ \_Node\&\ node\ =\ table\_[idx];} \DoxyCodeLine{00274\ } \DoxyCodeLine{00275\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(*node.value\ ==\ x)\ \textcolor{keywordflow}{return};} \DoxyCodeLine{00276\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(psl\ >\ node.psl)} \DoxyCodeLine{00277\ \ \ \ \ \ \ \ \ \{} \DoxyCodeLine{00278\ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ std::swap(psl,\ node.psl);\ std::swap(value,\ node.value);}} \DoxyCodeLine{00279\ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ temp\_psl\ =\ psl;\ \ \ \ \ \ \ \ psl\ =\ node.psl;\ \ \ node.psl\ =\ temp\_psl;} \DoxyCodeLine{00280\ \ \ \ \ \ \ \ \ \ \ \ \ T\ \ \ temp\_val\ =\ std::move(node.value);\ node.value\ =\ std::move(val);\ val\ =\ std::move(temp\_val);} \DoxyCodeLine{00281\ \ \ \ \ \ \ \ \ \}} \DoxyCodeLine{00282\ } \DoxyCodeLine{00283\ \ \ \ \ \ \ \ \ idx\ =\ \_next(idx);} \DoxyCodeLine{00284\ \ \ \ \ \ \ \ \ ++psl;} \DoxyCodeLine{00285\ \ \ \ \ \}} \DoxyCodeLine{00286\ } \DoxyCodeLine{00287\ \ \ \ \ std::construct\_at(table\_\ +\ idx,\ val,\ psl);} \DoxyCodeLine{00288\ \ \ \ \ ++size\_;} \DoxyCodeLine{00289\ \}} \DoxyCodeLine{00290\ } \DoxyCodeLine{00291\ \textcolor{keyword}{template}<\textcolor{keyword}{typename}\ T,\ \textcolor{keyword}{class}\ Hash,\ \textcolor{keyword}{class}\ Alloc>} \DoxyCodeLine{00292\ \textcolor{keywordtype}{void}\ hash\_table::erase(const\_reference\ x)} \DoxyCodeLine{00293\ \{} \DoxyCodeLine{00294\ \ \ \ \ node\ idx\ =\ \_find(x);} \DoxyCodeLine{00295\ \ \ \ \ \textcolor{keywordflow}{if}(idx\ ==\ nullnode)\ \textcolor{keywordflow}{return};} \DoxyCodeLine{00296\ } \DoxyCodeLine{00297\ \ \ \ \ table\_[idx].value.reset();} \DoxyCodeLine{00298\ \ \ \ \ -\/-\/size\_;} \DoxyCodeLine{00299\ } \DoxyCodeLine{00300\ \ \ \ \ node\ prev\ =\ idx;\ idx\ =\ \_next(idx);} \DoxyCodeLine{00301\ \ \ \ \ \textcolor{keywordflow}{while}(table\_[idx].value()\ \&\&\ table\_[idx].psl\ >\ 0)} \DoxyCodeLine{00302\ \ \ \ \ \{} \DoxyCodeLine{00303\ \ \ \ \ \ \ \ \ \_Node\ \&a\ =\ table\_[prev],\ \&b\ =\ table\_[idx];} \DoxyCodeLine{00304\ \ \ \ \ \ \ \ \ std::swap(a,\ b);} \DoxyCodeLine{00305\ \ \ \ \ \ \ \ \ -\/-\/a.psl;\ prev\ =\ idx;\ idx\ =\ \_next(idx);} \DoxyCodeLine{00306\ \ \ \ \ \}} \DoxyCodeLine{00307\ \}} \DoxyCodeLine{00308\ } \DoxyCodeLine{00309\ \textcolor{keyword}{template}<\textcolor{keyword}{typename}\ T,\ \textcolor{keyword}{class}\ Hash,\ \textcolor{keyword}{class}\ Alloc>} \DoxyCodeLine{00310\ \textcolor{keywordtype}{bool}\ hash\_table::contains(const\_reference\ x)} \DoxyCodeLine{00311\ \{} \DoxyCodeLine{00312\ \ \ \ \ \textcolor{keywordflow}{return}\ \_find(x)\ !=\ nullnode;} \DoxyCodeLine{00313\ \}} \DoxyCodeLine{00314\ } \DoxyCodeLine{00315\ \textcolor{keyword}{template}<\textcolor{keyword}{typename}\ T,\ \textcolor{keyword}{class}\ Hash,\ \textcolor{keyword}{class}\ Alloc>} \DoxyCodeLine{00316\ \textcolor{keywordtype}{void}\ hash\_table::\_increase\_capacity()} \DoxyCodeLine{00317\ \{} \DoxyCodeLine{00318\ \ \ \ \ table\_type\ old\ =\ table\_;} \DoxyCodeLine{00319\ \ \ \ \ size\_type\ \ old\_capacity\ =\ capacity\_;} \DoxyCodeLine{00320\ \ \ \ \ alloc\_.deallocate(table\_,\ capacity\_);} \DoxyCodeLine{00321\ \ \ \ \ capacity\_\ =\ \_next\_prime(capacity\_);} \DoxyCodeLine{00322\ \ \ \ \ table\_\ \ \ \ =\ alloc\_.allocate(capacity\_);} \DoxyCodeLine{00323\ \ \ \ \ memset(table\_,\ 0,\ capacity\_\ *\ \textcolor{keyword}{sizeof}(\_Node));} \DoxyCodeLine{00324\ \ \ \ \ size\_\ =\ 0;} \DoxyCodeLine{00325\ } \DoxyCodeLine{00326\ \ \ \ \ \textcolor{keywordflow}{for}(size\_type\ i\ =\ 0;\ i\ <\ old\_capacity;\ ++i)} \DoxyCodeLine{00327\ \ \ \ \ \{} \DoxyCodeLine{00328\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(old[i].value())\ insert(old[i].value);} \DoxyCodeLine{00329\ \ \ \ \ \}} \DoxyCodeLine{00330\ } \DoxyCodeLine{00331\ \ \ \ \ alloc\_.deallocate(old,\ old\_capacity);} \DoxyCodeLine{00332\ \}} \DoxyCodeLine{00333\ } \DoxyCodeLine{00334\ \textcolor{keyword}{template}<\textcolor{keyword}{typename}\ T,\ \textcolor{keyword}{class}\ Hash,\ \textcolor{keyword}{class}\ Alloc>} \DoxyCodeLine{00335\ \textcolor{keyword}{typename}\ hash\_table::node\ hash\_table::\_hash(const\_reference\ v)\textcolor{keyword}{\ const}} \DoxyCodeLine{00336\ \textcolor{keyword}{}\{} \DoxyCodeLine{00337\ \ \ \ \ node\ x\ =\ \textcolor{keyword}{static\_cast<}node\textcolor{keyword}{>}(hash\_(v));} \DoxyCodeLine{00338\ } \DoxyCodeLine{00339\ \ \ \ \ x\ \string^=\ x\ >>\ 33U;} \DoxyCodeLine{00340\ \ \ \ \ x\ *=\ UINT64\_C(0xff51afd7ed558ccd);} \DoxyCodeLine{00341\ \ \ \ \ x\ \string^=\ x\ >>\ 33U;} \DoxyCodeLine{00342\ \ \ \ \ x\ *=\ UINT64\_C(0xc4ceb9fe1a85ec53);} \DoxyCodeLine{00343\ \ \ \ \ x\ \string^=\ x\ >>\ 33U;} \DoxyCodeLine{00344\ } \DoxyCodeLine{00345\ \ \ \ \ \textcolor{keywordflow}{return}\ x\ \%\ capacity\_;} \DoxyCodeLine{00346\ \}} \DoxyCodeLine{00347\ } \DoxyCodeLine{00348\ \textcolor{keyword}{template}<\textcolor{keyword}{typename}\ T,\ \textcolor{keyword}{class}\ Hash,\ \textcolor{keyword}{class}\ Alloc>} \DoxyCodeLine{00349\ \textcolor{keyword}{typename}\ hash\_table::node\ hash\_table::\_find(const\_reference\ x)\textcolor{keyword}{\ const}} \DoxyCodeLine{00350\ \textcolor{keyword}{}\{} \DoxyCodeLine{00351\ \ \ \ \ \textcolor{keywordflow}{if}(capacity\_\ ==\ 0)\ \textcolor{keywordflow}{return}\ nullnode;} \DoxyCodeLine{00352\ \ \ \ \ node\ idx\ =\ \_hash(x);} \DoxyCodeLine{00353\ \ \ \ \ \textcolor{keywordtype}{int}\ psl\ =\ 0;} \DoxyCodeLine{00354\ } \DoxyCodeLine{00355\ \ \ \ \ \textcolor{keywordflow}{while}(table\_[idx].value())} \DoxyCodeLine{00356\ \ \ \ \ \{} \DoxyCodeLine{00357\ \ \ \ \ \ \ \ \ \_Node\&\ node\ =\ table\_[idx];} \DoxyCodeLine{00358\ } \DoxyCodeLine{00359\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(node.psl\ >\ psl)\ \ \textcolor{keywordflow}{return}\ nullnode;} \DoxyCodeLine{00360\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(*node.value\ ==\ x)\ \textcolor{keywordflow}{return}\ idx;} \DoxyCodeLine{00361\ } \DoxyCodeLine{00362\ \ \ \ \ \ \ \ \ idx\ =\ \_next(idx);\ ++psl;} \DoxyCodeLine{00363\ \ \ \ \ \}} \DoxyCodeLine{00364\ } \DoxyCodeLine{00365\ \ \ \ \ \textcolor{keywordflow}{return}\ nullnode;} \DoxyCodeLine{00366\ \}} \DoxyCodeLine{00367\ } \DoxyCodeLine{00368\ \textcolor{keyword}{template}<\textcolor{keyword}{typename}\ T,\ \textcolor{keyword}{class}\ Hash,\ \textcolor{keyword}{class}\ Alloc>} \DoxyCodeLine{00369\ \textcolor{keyword}{typename}\ hash\_table::size\_type\ hash\_table::\_next\_prime(size\_type\ x)} \DoxyCodeLine{00370\ \{} \DoxyCodeLine{00371\ \ \ \ \ size\_type\ n\ =\ (x\ +\ 1)\ /\ 6;} \DoxyCodeLine{00372\ \ \ \ \ n\ *=\ 2;} \DoxyCodeLine{00373\ } \DoxyCodeLine{00374\ \ \ \ \ \textcolor{keywordflow}{while}(\textcolor{keyword}{true})} \DoxyCodeLine{00375\ \ \ \ \ \{} \DoxyCodeLine{00376\ \ \ \ \ \ \ \ \ x\ =\ (n\ *\ 6)\ -\/\ 1;} \DoxyCodeLine{00377\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(!is\_prime(x))\ x\ =\ (n\ *\ 6)\ +\ 1;} \DoxyCodeLine{00378\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(!is\_prime(x))\ \{\ ++n;\ \textcolor{keywordflow}{continue};\ \}} \DoxyCodeLine{00379\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ std::max(x,\ 7ull);} \DoxyCodeLine{00380\ \ \ \ \ \}} \DoxyCodeLine{00381\ \}} \DoxyCodeLine{00382\ } \DoxyCodeLine{00383\ \textcolor{keyword}{template}<\textcolor{keyword}{typename}\ T,\ \textcolor{keyword}{class}\ Hash,\ \textcolor{keyword}{class}\ Alloc>} \DoxyCodeLine{00384\ \textcolor{keyword}{typename}\ hash\_table::size\_type\ hash\_table::\_prev\_prime(size\_type\ x)} \DoxyCodeLine{00385\ \{} \DoxyCodeLine{00386\ \ \ \ \ size\_type\ n\ =\ (x\ +\ 1)\ /\ 6;} \DoxyCodeLine{00387\ \ \ \ \ n\ *=\ 2;} \DoxyCodeLine{00388\ } \DoxyCodeLine{00389\ \ \ \ \ \textcolor{keywordflow}{while}(\textcolor{keyword}{true})} \DoxyCodeLine{00390\ \ \ \ \ \{} \DoxyCodeLine{00391\ \ \ \ \ \ \ \ \ x\ =\ (n\ *\ 6)\ -\/\ 1;} \DoxyCodeLine{00392\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(!is\_prime(x))\ x\ =\ (n\ *\ 6)\ +\ 1;} \DoxyCodeLine{00393\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(!is\_prime(x))\ \{\ -\/-\/n;\ \textcolor{keywordflow}{continue};\ \}} \DoxyCodeLine{00394\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ std::max(x,\ 7ull);} \DoxyCodeLine{00395\ \ \ \ \ \}} \DoxyCodeLine{00396\ \}} \DoxyCodeLine{00397\ } \DoxyCodeLine{00398\ \}} \DoxyCodeLine{00399\ } \DoxyCodeLine{00400\ \textcolor{preprocessor}{\#endif\ }\textcolor{comment}{//\ OPEN\_CPP\_UTILS\_HASH\_TABLE\_H}} \end{DoxyCode}