€•ÞÅŒsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ%/translations/zh_CN/core-api/min_heap”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/zh_TW/core-api/min_heap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/it_IT/core-api/min_heap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/ja_JP/core-api/min_heap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/ko_KR/core-api/min_heap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/pt_BR/core-api/min_heap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/sp_SP/core-api/min_heap”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³Œ?/var/lib/git/docbuild/linux/Documentation/core-api/min_heap.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒ Min Heap API”h]”hŒ Min Heap API”…”�”}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ field_list”“”)�”}”(hhh]”hŒfield”“”)�”}”(hhh]”(hŒ field_name”“”)�”}”(hŒAuthor”h]”hŒAuthor”…”�”}”(hhéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhhäh³hÇh´KubhŒ field_body”“”)�”}”(hŒ%Kuan-Wei Chiu ”h]”hŒ paragraph”“”)�”}”(hŒ$Kuan-Wei Chiu ”h]”(hŒKuan-Wei Chiu <”…”�”}”(hhÿh²hh³Nh´NubhŒ reference”“”)�”}”(hŒvisitorckw@gmail.com”h]”hŒvisitorckw@gmail.com”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:visitorckw@gmail.com”uh1jhhÿubhŒ>”…”�”}”(hhÿh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Khhùubah}”(h]”h ]”h"]”h$]”h&]”uh1h÷hhäubeh}”(h]”h ]”h"]”h$]”h&]”uh1hâh³hÇh´Khhßh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Introduction”h]”hŒ Introduction”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj5h²hh³hÇh´K ubhþ)�”}”(hXThe Min Heap API provides a set of functions and macros for managing min-heaps in the Linux kernel. A min-heap is a binary tree structure where the value of each node is less than or equal to the values of its children, ensuring that the smallest element is always at the root.”h]”hXThe Min Heap API provides a set of functions and macros for managing min-heaps in the Linux kernel. A min-heap is a binary tree structure where the value of each node is less than or equal to the values of its children, ensuring that the smallest element is always at the root.”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K hj5h²hubhþ)�”}”(hŒÝThis document provides a guide to the Min Heap API, detailing how to define and use min-heaps. Users should not directly call functions with **__min_heap_*()** prefixes, but should instead use the provided macro wrappers.”h]”(hŒ�This document provides a guide to the Min Heap API, detailing how to define and use min-heaps. Users should not directly call functions with ”…”�”}”(hjTh²hh³Nh´NubhŒstrong”“”)�”}”(hŒ**__min_heap_*()**”h]”hŒ__min_heap_*()”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjTubhŒ> prefixes, but should instead use the provided macro wrappers.”…”�”}”(hjTh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Khj5h²hubhþ)�”}”(hXIn addition to the standard version of the functions, the API also includes a set of inline versions for performance-critical scenarios. These inline functions have the same names as their non-inline counterparts but include an **_inline** suffix. For example, **__min_heap_init_inline** and its corresponding macro wrapper **min_heap_init_inline**. The inline versions allow custom comparison and swap functions to be called directly, rather than through indirect function calls. This can significantly reduce overhead, especially when CONFIG_MITIGATION_RETPOLINE is enabled, as indirect function calls become more expensive. As with the non-inline versions, it is important to use the macro wrappers for inline functions instead of directly calling the functions themselves.”h]”(hŒäIn addition to the standard version of the functions, the API also includes a set of inline versions for performance-critical scenarios. These inline functions have the same names as their non-inline counterparts but include an ”…”�”}”(hjvh²hh³Nh´Nubj])�”}”(hŒ **_inline**”h]”hŒ_inline”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjvubhŒ suffix. For example, ”…”�”}”(hjvh²hh³Nh´Nubj])�”}”(hŒ**__min_heap_init_inline**”h]”hŒ__min_heap_init_inline”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjvubhŒ% and its corresponding macro wrapper ”…”�”}”(hjvh²hh³Nh´Nubj])�”}”(hŒ**min_heap_init_inline**”h]”hŒmin_heap_init_inline”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjvubhX¬. The inline versions allow custom comparison and swap functions to be called directly, rather than through indirect function calls. This can significantly reduce overhead, especially when CONFIG_MITIGATION_RETPOLINE is enabled, as indirect function calls become more expensive. As with the non-inline versions, it is important to use the macro wrappers for inline functions instead of directly calling the functions themselves.”…”�”}”(hjvh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Khj5h²hubeh}”(h]”Œ introduction”ah ]”h"]”Œ introduction”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒData Structures”h]”hŒData Structures”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÂh²hh³hÇh´K"ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒMin-Heap Definition”h]”hŒMin-Heap Definition”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÓh²hh³hÇh´K%ubhþ)�”}”(hŒêThe core data structure for representing a min-heap is defined using the **MIN_HEAP_PREALLOCATED** and **DEFINE_MIN_HEAP** macros. These macros allow you to define a min-heap with a preallocated buffer or dynamically allocated memory.”h]”(hŒIThe core data structure for representing a min-heap is defined using the ”…”�”}”(hjäh²hh³Nh´Nubj])�”}”(hŒ**MIN_HEAP_PREALLOCATED**”h]”hŒMIN_HEAP_PREALLOCATED”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjäubhŒ and ”…”�”}”(hjäh²hh³Nh´Nubj])�”}”(hŒ**DEFINE_MIN_HEAP**”h]”hŒDEFINE_MIN_HEAP”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjäubhŒp macros. These macros allow you to define a min-heap with a preallocated buffer or dynamically allocated memory.”…”�”}”(hjäh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K'hjÓh²hubhþ)�”}”(hŒExample:”h]”hŒExample:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K,hjÓh²hubhŒ literal_block”“”)�”}”(hX…#define MIN_HEAP_PREALLOCATED(_type, _name, _nr) struct _name { size_t nr; /* Number of elements in the heap */ size_t size; /* Maximum number of elements that can be held */ _type *data; /* Pointer to the heap data */ _type preallocated[_nr]; /* Static preallocated array */ } #define DEFINE_MIN_HEAP(_type, _name) MIN_HEAP_PREALLOCATED(_type, _name, 0)”h]”hX…#define MIN_HEAP_PREALLOCATED(_type, _name, _nr) struct _name { size_t nr; /* Number of elements in the heap */ size_t size; /* Maximum number of elements that can be held */ _type *data; /* Pointer to the heap data */ _type preallocated[_nr]; /* Static preallocated array */ } #define DEFINE_MIN_HEAP(_type, _name) MIN_HEAP_PREALLOCATED(_type, _name, 0)”…”�”}”hj&sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒforce”‰Œlanguage”Œc”Œhighlight_args”}”uh1j$h³hÇh´K.hjÓh²hubhþ)�”}”(hXA typical heap structure will include a counter for the number of elements (`nr`), the maximum capacity of the heap (`size`), and a pointer to an array of elements (`data`). Optionally, you can specify a static array for preallocated heap storage using **MIN_HEAP_PREALLOCATED**.”h]”(hŒLA typical heap structure will include a counter for the number of elements (”…”�”}”(hj9h²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ`nr`”h]”hŒnr”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj9ubhŒ%), the maximum capacity of the heap (”…”�”}”(hj9h²hh³Nh´NubjB)�”}”(hŒ`size`”h]”hŒsize”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj9ubhŒ*), and a pointer to an array of elements (”…”�”}”(hj9h²hh³Nh´NubjB)�”}”(hŒ`data`”h]”hŒdata”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj9ubhŒR). Optionally, you can specify a static array for preallocated heap storage using ”…”�”}”(hj9h²hh³Nh´Nubj])�”}”(hŒ**MIN_HEAP_PREALLOCATED**”h]”hŒMIN_HEAP_PREALLOCATED”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj9ubhŒ.”…”�”}”(hj9h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K:hjÓh²hubeh}”(h]”Œmin-heap-definition”ah ]”h"]”Œmin-heap definition”ah$]”h&]”uh1hÈhjÂh²hh³hÇh´K%ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒMin Heap Callbacks”h]”hŒMin Heap Callbacks”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj™h²hh³hÇh´K@ubhþ)�”}”(hŒ˜The **struct min_heap_callbacks** provides customization options for ordering elements in the heap and swapping them. It contains two function pointers:”h]”(hŒThe ”…”�”}”(hjªh²hh³Nh´Nubj])�”}”(hŒ**struct min_heap_callbacks**”h]”hŒstruct min_heap_callbacks”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjªubhŒw provides customization options for ordering elements in the heap and swapping them. It contains two function pointers:”…”�”}”(hjªh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KBhj™h²hubj%)�”}”(hŒ‘struct min_heap_callbacks { bool (*less)(const void *lhs, const void *rhs, void *args); void (*swp)(void *lhs, void *rhs, void *args); };”h]”hŒ‘struct min_heap_callbacks { bool (*less)(const void *lhs, const void *rhs, void *args); void (*swp)(void *lhs, void *rhs, void *args); };”…”�”}”hjÊsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj4‰j5j6j7}”uh1j$h³hÇh´KEhj™h²hubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒL**less** is the comparison function used to establish the order of elements.”h]”hþ)�”}”(hjâh]”(j])�”}”(hŒ**less**”h]”hŒless”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjäubhŒD is the comparison function used to establish the order of elements.”…”�”}”(hjäh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KLhjàubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjÛh²hh³hÇh´Nubjß)�”}”(hŒ¥**swp** is a function for swapping elements in the heap. If swp is set to NULL, the default swap function will be used, which swaps the elements based on their size ”h]”hþ)�”}”(hŒ¤**swp** is a function for swapping elements in the heap. If swp is set to NULL, the default swap function will be used, which swaps the elements based on their size”h]”(j])�”}”(hŒ**swp**”h]”hŒswp”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj ubhŒ� is a function for swapping elements in the heap. If swp is set to NULL, the default swap function will be used, which swaps the elements based on their size”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KMhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjÛh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jÙh³hÇh´KLhj™h²hubeh}”(h]”Œmin-heap-callbacks”ah ]”h"]”Œmin heap callbacks”ah$]”h&]”uh1hÈhjÂh²hh³hÇh´K@ubeh}”(h]”Œdata-structures”ah ]”h"]”Œdata structures”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K"ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒMacro Wrappers”h]”hŒMacro Wrappers”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjCh²hh³hÇh´KQubhþ)�”}”(hŒÝThe following macro wrappers are provided for interacting with the heap in a user-friendly manner. Each macro corresponds to a function that operates on the heap, and they abstract away direct calls to internal functions.”h]”hŒÝThe following macro wrappers are provided for interacting with the heap in a user-friendly manner. Each macro corresponds to a function that operates on the heap, and they abstract away direct calls to internal functions.”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KShjCh²hubhþ)�”}”(hŒ>Each macro accepts various parameters that are detailed below.”h]”hŒ>Each macro accepts various parameters that are detailed below.”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KWhjCh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒHeap Initialization”h]”hŒHeap Initialization”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjph²hh³hÇh´KZubj%)�”}”(hŒ min_heap_init(heap, data, size);”h]”hŒ min_heap_init(heap, data, size);”…”�”}”hj�sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj4‰j5j6j7}”uh1j$h³hÇh´K\hjph²hubjÚ)�”}”(hhh]”(jß)�”}”(hŒ@**heap**: A pointer to the min-heap structure to be initialized.”h]”hþ)�”}”(hj•h]”(j])�”}”(hŒ**heap**”h]”hŒheap”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj—ubhŒ8: A pointer to the min-heap structure to be initialized.”…”�”}”(hj—h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K`hj“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhj�h²hh³hÇh´Nubjß)�”}”(hŒ”**data**: A pointer to the buffer where the heap elements will be stored. If `NULL`, the preallocated buffer within the heap structure will be used.”h]”hþ)�”}”(hŒ”**data**: A pointer to the buffer where the heap elements will be stored. If `NULL`, the preallocated buffer within the heap structure will be used.”h]”(j])�”}”(hŒ**data**”h]”hŒdata”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj¼ubhŒE: A pointer to the buffer where the heap elements will be stored. If ”…”�”}”(hj¼h²hh³Nh´NubjB)�”}”(hŒ`NULL`”h]”hŒNULL”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj¼ubhŒA, the preallocated buffer within the heap structure will be used.”…”�”}”(hj¼h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kahj¸ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhj�h²hh³hÇh´Nubjß)�”}”(hŒ<**size**: The maximum number of elements the heap can hold. ”h]”hþ)�”}”(hŒ;**size**: The maximum number of elements the heap can hold.”h]”(j])�”}”(hŒ**size**”h]”hŒsize”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjôubhŒ3: The maximum number of elements the heap can hold.”…”�”}”(hjôh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kchjðubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhj�h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j1j2uh1jÙh³hÇh´K`hjph²hubhþ)�”}”(hŒäThis macro initializes the heap, setting its initial state. If `data` is `NULL`, the preallocated memory inside the heap structure will be used for storage. Otherwise, the user-provided buffer is used. The operation is **O(1)**.”h]”(hŒ?This macro initializes the heap, setting its initial state. If ”…”�”}”(hjh²hh³Nh´NubjB)�”}”(hŒ`data`”h]”hŒdata”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjubhŒ is ”…”�”}”(hjh²hh³Nh´NubjB)�”}”(hŒ`NULL`”h]”hŒNULL”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjubhŒŒ, the preallocated memory inside the heap structure will be used for storage. Otherwise, the user-provided buffer is used. The operation is ”…”�”}”(hjh²hh³Nh´Nubj])�”}”(hŒ**O(1)**”h]”hŒO(1)”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjubhŒ.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kehjph²hubhþ)�”}”(hŒ:**Inline Version:** min_heap_init_inline(heap, data, size)”h]”(j])�”}”(hŒ**Inline Version:**”h]”hŒInline Version:”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj`ubhŒ' min_heap_init_inline(heap, data, size)”…”�”}”(hj`h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kihjph²hubeh}”(h]”Œheap-initialization”ah ]”h"]”Œheap initialization”ah$]”h&]”uh1hÈhjCh²hh³hÇh´KZubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒAccessing the Top Element”h]”hŒAccessing the Top Element”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj„h²hh³hÇh´Klubj%)�”}”(hŒelement = min_heap_peek(heap);”h]”hŒelement = min_heap_peek(heap);”…”�”}”hj•sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj4‰j5j6j7}”uh1j$h³hÇh´Knhj„h²hubjÚ)�”}”(hhh]”jß)�”}”(hŒQ**heap**: A pointer to the min-heap from which to retrieve the smallest element. ”h]”hþ)�”}”(hŒP**heap**: A pointer to the min-heap from which to retrieve the smallest element.”h]”(j])�”}”(hŒ**heap**”h]”hŒheap”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj«ubhŒH: A pointer to the min-heap from which to retrieve the smallest element.”…”�”}”(hj«h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Krhj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhj¤h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”j1j2uh1jÙh³hÇh´Krhj„h²hubhþ)�”}”(hŒ‡This macro returns a pointer to the smallest element (the root) of the heap, or `NULL` if the heap is empty. The operation is **O(1)**.”h]”(hŒPThis macro returns a pointer to the smallest element (the root) of the heap, or ”…”�”}”(hjÓh²hh³Nh´NubjB)�”}”(hŒ`NULL`”h]”hŒNULL”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjÓubhŒ( if the heap is empty. The operation is ”…”�”}”(hjÓh²hh³Nh´Nubj])�”}”(hŒ**O(1)**”h]”hŒO(1)”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjÓubhŒ.”…”�”}”(hjÓh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kuhj„h²hubhþ)�”}”(hŒ.**Inline Version:** min_heap_peek_inline(heap)”h]”(j])�”}”(hŒ**Inline Version:**”h]”hŒInline Version:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjubhŒ min_heap_peek_inline(heap)”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kxhj„h²hubeh}”(h]”Œaccessing-the-top-element”ah ]”h"]”Œaccessing the top element”ah$]”h&]”uh1hÈhjCh²hh³hÇh´KlubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒHeap Insertion”h]”hŒHeap Insertion”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj)h²hh³hÇh´K{ubj%)�”}”(hŒ8success = min_heap_push(heap, element, callbacks, args);”h]”hŒ8success = min_heap_push(heap, element, callbacks, args);”…”�”}”hj:sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj4‰j5j6j7}”uh1j$h³hÇh´K}hj)h²hubjÚ)�”}”(hhh]”(jß)�”}”(hŒN**heap**: A pointer to the min-heap into which the element should be inserted.”h]”hþ)�”}”(hjNh]”(j])�”}”(hŒ**heap**”h]”hŒheap”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjPubhŒF: A pointer to the min-heap into which the element should be inserted.”…”�”}”(hjPh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K�hjLubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjIh²hh³hÇh´Nubjß)�”}”(hŒC**element**: A pointer to the element to be inserted into the heap.”h]”hþ)�”}”(hjsh]”(j])�”}”(hŒ **element**”h]”hŒelement”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjuubhŒ8: A pointer to the element to be inserted into the heap.”…”�”}”(hjuh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K‚hjqubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjIh²hh³hÇh´Nubjß)�”}”(hŒc**callbacks**: A pointer to a `struct min_heap_callbacks` providing the `less` and `swp` functions.”h]”hþ)�”}”(hŒc**callbacks**: A pointer to a `struct min_heap_callbacks` providing the `less` and `swp` functions.”h]”(j])�”}”(hŒ **callbacks**”h]”hŒ callbacks”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjšubhŒ: A pointer to a ”…”�”}”(hjšh²hh³Nh´NubjB)�”}”(hŒ`struct min_heap_callbacks`”h]”hŒstruct min_heap_callbacks”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjšubhŒ providing the ”…”�”}”(hjšh²hh³Nh´NubjB)�”}”(hŒ`less`”h]”hŒless”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjšubhŒ and ”…”�”}”(hjšh²hh³Nh´NubjB)�”}”(hŒ`swp`”h]”hŒswp”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjšubhŒ functions.”…”�”}”(hjšh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kƒhj–ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjIh²hh³hÇh´Nubjß)�”}”(hŒG**args**: Optional arguments passed to the `less` and `swp` functions. ”h]”hþ)�”}”(hŒF**args**: Optional arguments passed to the `less` and `swp` functions.”h]”(j])�”}”(hŒ**args**”h]”hŒargs”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjöubhŒ#: Optional arguments passed to the ”…”�”}”(hjöh²hh³Nh´NubjB)�”}”(hŒ`less`”h]”hŒless”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjöubhŒ and ”…”�”}”(hjöh²hh³Nh´NubjB)�”}”(hŒ`swp`”h]”hŒswp”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjöubhŒ functions.”…”�”}”(hjöh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K…hjòubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjIh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j1j2uh1jÙh³hÇh´K�hj)h²hubhþ)�”}”(hŒžThis macro inserts an element into the heap. It returns `true` if the insertion was successful and `false` if the heap is full. The operation is **O(log n)**.”h]”(hŒ8This macro inserts an element into the heap. It returns ”…”�”}”(hjBh²hh³Nh´NubjB)�”}”(hŒ`true`”h]”hŒtrue”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjBubhŒ% if the insertion was successful and ”…”�”}”(hjBh²hh³Nh´NubjB)�”}”(hŒ`false`”h]”hŒfalse”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjBubhŒ' if the heap is full. The operation is ”…”�”}”(hjBh²hh³Nh´Nubj])�”}”(hŒ **O(log n)**”h]”hŒO(log n)”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjBubhŒ.”…”�”}”(hjBh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K‡hj)h²hubhþ)�”}”(hŒH**Inline Version:** min_heap_push_inline(heap, element, callbacks, args)”h]”(j])�”}”(hŒ**Inline Version:**”h]”hŒInline Version:”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj†ubhŒ5 min_heap_push_inline(heap, element, callbacks, args)”…”�”}”(hj†h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KŠhj)h²hubeh}”(h]”Œheap-insertion”ah ]”h"]”Œheap insertion”ah$]”h&]”uh1hÈhjCh²hh³hÇh´K{ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Heap Removal”h]”hŒ Heap Removal”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjªh²hh³hÇh´K�ubj%)�”}”(hŒ.success = min_heap_pop(heap, callbacks, args);”h]”hŒ.success = min_heap_pop(heap, callbacks, args);”…”�”}”hj»sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj4‰j5j6j7}”uh1j$h³hÇh´K�hjªh²hubjÚ)�”}”(hhh]”(jß)�”}”(hŒN**heap**: A pointer to the min-heap from which to remove the smallest element.”h]”hþ)�”}”(hjÏh]”(j])�”}”(hŒ**heap**”h]”hŒheap”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjÑubhŒF: A pointer to the min-heap from which to remove the smallest element.”…”�”}”(hjÑh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K“hjÍubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjÊh²hh³hÇh´Nubjß)�”}”(hŒc**callbacks**: A pointer to a `struct min_heap_callbacks` providing the `less` and `swp` functions.”h]”hþ)�”}”(hŒc**callbacks**: A pointer to a `struct min_heap_callbacks` providing the `less` and `swp` functions.”h]”(j])�”}”(hŒ **callbacks**”h]”hŒ callbacks”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjöubhŒ: A pointer to a ”…”�”}”(hjöh²hh³Nh´NubjB)�”}”(hŒ`struct min_heap_callbacks`”h]”hŒstruct min_heap_callbacks”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjöubhŒ providing the ”…”�”}”(hjöh²hh³Nh´NubjB)�”}”(hŒ`less`”h]”hŒless”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjöubhŒ and ”…”�”}”(hjöh²hh³Nh´NubjB)�”}”(hŒ`swp`”h]”hŒswp”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjöubhŒ functions.”…”�”}”(hjöh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K”hjòubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjÊh²hh³hÇh´Nubjß)�”}”(hŒG**args**: Optional arguments passed to the `less` and `swp` functions. ”h]”hþ)�”}”(hŒF**args**: Optional arguments passed to the `less` and `swp` functions.”h]”(j])�”}”(hŒ**args**”h]”hŒargs”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjRubhŒ#: Optional arguments passed to the ”…”�”}”(hjRh²hh³Nh´NubjB)�”}”(hŒ`less`”h]”hŒless”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjRubhŒ and ”…”�”}”(hjRh²hh³Nh´NubjB)�”}”(hŒ`swp`”h]”hŒswp”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjRubhŒ functions.”…”�”}”(hjRh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K–hjNubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjÊh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j1j2uh1jÙh³hÇh´K“hjªh²hubhþ)�”}”(hŒ¼This macro removes the smallest element (the root) from the heap. It returns `true` if the element was successfully removed, or `false` if the heap is empty. The operation is **O(log n)**.”h]”(hŒMThis macro removes the smallest element (the root) from the heap. It returns ”…”�”}”(hjžh²hh³Nh´NubjB)�”}”(hŒ`true`”h]”hŒtrue”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjžubhŒ- if the element was successfully removed, or ”…”�”}”(hjžh²hh³Nh´NubjB)�”}”(hŒ`false`”h]”hŒfalse”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjžubhŒ( if the heap is empty. The operation is ”…”�”}”(hjžh²hh³Nh´Nubj])�”}”(hŒ **O(log n)**”h]”hŒO(log n)”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjžubhŒ.”…”�”}”(hjžh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K˜hjªh²hubhþ)�”}”(hŒ>**Inline Version:** min_heap_pop_inline(heap, callbacks, args)”h]”(j])�”}”(hŒ**Inline Version:**”h]”hŒInline Version:”…”�”}”(hjæh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjâubhŒ+ min_heap_pop_inline(heap, callbacks, args)”…”�”}”(hjâh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kœhjªh²hubeh}”(h]”Œ heap-removal”ah ]”h"]”Œ heap removal”ah$]”h&]”uh1hÈhjCh²hh³hÇh´K�ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒHeap Maintenance”h]”hŒHeap Maintenance”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´KŸubhþ)�”}”(hŒBYou can use the following macros to maintain the heap's structure:”h]”hŒDYou can use the following macros to maintain the heap’s structure:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K¡hjh²hubj%)�”}”(hŒ/min_heap_sift_down(heap, pos, callbacks, args);”h]”hŒ/min_heap_sift_down(heap, pos, callbacks, args);”…”�”}”hj%sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj4‰j5j6j7}”uh1j$h³hÇh´K£hjh²hubjÚ)�”}”(hhh]”(jß)�”}”(hŒ$**heap**: A pointer to the min-heap.”h]”hþ)�”}”(hj9h]”(j])�”}”(hŒ**heap**”h]”hŒheap”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj;ubhŒ: A pointer to the min-heap.”…”�”}”(hj;h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K§hj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhj4h²hh³hÇh´Nubjß)�”}”(hŒ4**pos**: The index from which to start sifting down.”h]”hþ)�”}”(hj^h]”(j])�”}”(hŒ**pos**”h]”hŒpos”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj`ubhŒ-: The index from which to start sifting down.”…”�”}”(hj`h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K¨hj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhj4h²hh³hÇh´Nubjß)�”}”(hŒc**callbacks**: A pointer to a `struct min_heap_callbacks` providing the `less` and `swp` functions.”h]”hþ)�”}”(hŒc**callbacks**: A pointer to a `struct min_heap_callbacks` providing the `less` and `swp` functions.”h]”(j])�”}”(hŒ **callbacks**”h]”hŒ callbacks”…”�”}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj…ubhŒ: A pointer to a ”…”�”}”(hj…h²hh³Nh´NubjB)�”}”(hŒ`struct min_heap_callbacks`”h]”hŒstruct min_heap_callbacks”…”�”}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj…ubhŒ providing the ”…”�”}”(hj…h²hh³Nh´NubjB)�”}”(hŒ`less`”h]”hŒless”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj…ubhŒ and ”…”�”}”(hj…h²hh³Nh´NubjB)�”}”(hŒ`swp`”h]”hŒswp”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj…ubhŒ functions.”…”�”}”(hj…h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K©hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhj4h²hh³hÇh´Nubjß)�”}”(hŒG**args**: Optional arguments passed to the `less` and `swp` functions. ”h]”hþ)�”}”(hŒF**args**: Optional arguments passed to the `less` and `swp` functions.”h]”(j])�”}”(hŒ**args**”h]”hŒargs”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjáubhŒ#: Optional arguments passed to the ”…”�”}”(hjáh²hh³Nh´NubjB)�”}”(hŒ`less`”h]”hŒless”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjáubhŒ and ”…”�”}”(hjáh²hh³Nh´NubjB)�”}”(hŒ`swp`”h]”hŒswp”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjáubhŒ functions.”…”�”}”(hjáh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K«hjÝubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhj4h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j1j2uh1jÙh³hÇh´K§hjh²hubhþ)�”}”(hŒ¬This macro restores the heap property by moving the element at the specified index (`pos`) down the heap until it is in the correct position. The operation is **O(log n)**.”h]”(hŒTThis macro restores the heap property by moving the element at the specified index (”…”�”}”(hj- h²hh³Nh´NubjB)�”}”(hŒ`pos`”h]”hŒpos”…”�”}”(hj5 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj- ubhŒF) down the heap until it is in the correct position. The operation is ”…”�”}”(hj- h²hh³Nh´Nubj])�”}”(hŒ **O(log n)**”h]”hŒO(log n)”…”�”}”(hjG h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj- ubhŒ.”…”�”}”(hj- h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K­hjh²hubhþ)�”}”(hŒI**Inline Version:** min_heap_sift_down_inline(heap, pos, callbacks, args)”h]”(j])�”}”(hŒ**Inline Version:**”h]”hŒInline Version:”…”�”}”(hjc h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj_ ubhŒ6 min_heap_sift_down_inline(heap, pos, callbacks, args)”…”�”}”(hj_ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K±hjh²hubj%)�”}”(hŒ-min_heap_sift_up(heap, idx, callbacks, args);”h]”hŒ-min_heap_sift_up(heap, idx, callbacks, args);”…”�”}”hj{ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj4‰j5j6j7}”uh1j$h³hÇh´K³hjh²hubjÚ)�”}”(hhh]”(jß)�”}”(hŒ$**heap**: A pointer to the min-heap.”h]”hþ)�”}”(hj� h]”(j])�”}”(hŒ**heap**”h]”hŒheap”…”�”}”(hj” h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj‘ ubhŒ: A pointer to the min-heap.”…”�”}”(hj‘ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K·hj� ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjŠ h²hh³hÇh´Nubjß)�”}”(hŒ-**idx**: The index of the element to sift up.”h]”hþ)�”}”(hj´ h]”(j])�”}”(hŒ**idx**”h]”hŒidx”…”�”}”(hj¹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj¶ ubhŒ&: The index of the element to sift up.”…”�”}”(hj¶ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K¸hj² ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjŠ h²hh³hÇh´Nubjß)�”}”(hŒc**callbacks**: A pointer to a `struct min_heap_callbacks` providing the `less` and `swp` functions.”h]”hþ)�”}”(hŒc**callbacks**: A pointer to a `struct min_heap_callbacks` providing the `less` and `swp` functions.”h]”(j])�”}”(hŒ **callbacks**”h]”hŒ callbacks”…”�”}”(hjß h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjÛ ubhŒ: A pointer to a ”…”�”}”(hjÛ h²hh³Nh´NubjB)�”}”(hŒ`struct min_heap_callbacks`”h]”hŒstruct min_heap_callbacks”…”�”}”(hjñ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjÛ ubhŒ providing the ”…”�”}”(hjÛ h²hh³Nh´NubjB)�”}”(hŒ`less`”h]”hŒless”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjÛ ubhŒ and ”…”�”}”(hjÛ h²hh³Nh´NubjB)�”}”(hŒ`swp`”h]”hŒswp”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjÛ ubhŒ functions.”…”�”}”(hjÛ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K¹hj× ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjŠ h²hh³hÇh´Nubjß)�”}”(hŒG**args**: Optional arguments passed to the `less` and `swp` functions. ”h]”hþ)�”}”(hŒF**args**: Optional arguments passed to the `less` and `swp` functions.”h]”(j])�”}”(hŒ**args**”h]”hŒargs”…”�”}”(hj; h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj7 ubhŒ#: Optional arguments passed to the ”…”�”}”(hj7 h²hh³Nh´NubjB)�”}”(hŒ`less`”h]”hŒless”…”�”}”(hjM h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj7 ubhŒ and ”…”�”}”(hj7 h²hh³Nh´NubjB)�”}”(hŒ`swp`”h]”hŒswp”…”�”}”(hj_ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj7 ubhŒ functions.”…”�”}”(hj7 h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K»hj3 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjŠ h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j1j2uh1jÙh³hÇh´K·hjh²hubhþ)�”}”(hŒ†This macro restores the heap property by moving the element at the specified index (`idx`) up the heap. The operation is **O(log n)**.”h]”(hŒTThis macro restores the heap property by moving the element at the specified index (”…”�”}”(hjƒ h²hh³Nh´NubjB)�”}”(hŒ`idx`”h]”hŒidx”…”�”}”(hj‹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjƒ ubhŒ ) up the heap. The operation is ”…”�”}”(hjƒ h²hh³Nh´Nubj])�”}”(hŒ **O(log n)**”h]”hŒO(log n)”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjƒ ubhŒ.”…”�”}”(hjƒ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´K½hjh²hubhþ)�”}”(hŒG**Inline Version:** min_heap_sift_up_inline(heap, idx, callbacks, args)”h]”(j])�”}”(hŒ**Inline Version:**”h]”hŒInline Version:”…”�”}”(hj¹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjµ ubhŒ4 min_heap_sift_up_inline(heap, idx, callbacks, args)”…”�”}”(hjµ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KÀhjh²hubj%)�”}”(hŒ'min_heapify_all(heap, callbacks, args);”h]”hŒ'min_heapify_all(heap, callbacks, args);”…”�”}”hjÑ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj4‰j5j6j7}”uh1j$h³hÇh´KÂhjh²hubjÚ)�”}”(hhh]”(jß)�”}”(hŒ$**heap**: A pointer to the min-heap.”h]”hþ)�”}”(hjå h]”(j])�”}”(hŒ**heap**”h]”hŒheap”…”�”}”(hjê h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjç ubhŒ: A pointer to the min-heap.”…”�”}”(hjç h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KÆhjã ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjà h²hh³hÇh´Nubjß)�”}”(hŒc**callbacks**: A pointer to a `struct min_heap_callbacks` providing the `less` and `swp` functions.”h]”hþ)�”}”(hŒc**callbacks**: A pointer to a `struct min_heap_callbacks` providing the `less` and `swp` functions.”h]”(j])�”}”(hŒ **callbacks**”h]”hŒ callbacks”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj ubhŒ: A pointer to a ”…”�”}”(hj h²hh³Nh´NubjB)�”}”(hŒ`struct min_heap_callbacks`”h]”hŒstruct min_heap_callbacks”…”�”}”(hj" h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj ubhŒ providing the ”…”�”}”(hj h²hh³Nh´NubjB)�”}”(hŒ`less`”h]”hŒless”…”�”}”(hj4 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj ubhŒ and ”…”�”}”(hj h²hh³Nh´NubjB)�”}”(hŒ`swp`”h]”hŒswp”…”�”}”(hjF h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj ubhŒ functions.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KÇhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjà h²hh³hÇh´Nubjß)�”}”(hŒG**args**: Optional arguments passed to the `less` and `swp` functions. ”h]”hþ)�”}”(hŒF**args**: Optional arguments passed to the `less` and `swp` functions.”h]”(j])�”}”(hŒ**args**”h]”hŒargs”…”�”}”(hjl h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjh ubhŒ#: Optional arguments passed to the ”…”�”}”(hjh h²hh³Nh´NubjB)�”}”(hŒ`less`”h]”hŒless”…”�”}”(hj~ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjh ubhŒ and ”…”�”}”(hjh h²hh³Nh´NubjB)�”}”(hŒ`swp`”h]”hŒswp”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjh ubhŒ functions.”…”�”}”(hjh h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KÉhjd ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjà h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j1j2uh1jÙh³hÇh´KÆhjh²hubhþ)�”}”(hŒ­This macro ensures that the entire heap satisfies the heap property. It is called when the heap is built from scratch or after many modifications. The operation is **O(n)**.”h]”(hŒ¤This macro ensures that the entire heap satisfies the heap property. It is called when the heap is built from scratch or after many modifications. The operation is ”…”�”}”(hj´ h²hh³Nh´Nubj])�”}”(hŒ**O(n)**”h]”hŒO(n)”…”�”}”(hj¼ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj´ ubhŒ.”…”�”}”(hj´ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KËhjh²hubhþ)�”}”(hŒA**Inline Version:** min_heapify_all_inline(heap, callbacks, args)”h]”(j])�”}”(hŒ**Inline Version:**”h]”hŒInline Version:”…”�”}”(hjØ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjÔ ubhŒ. min_heapify_all_inline(heap, callbacks, args)”…”�”}”(hjÔ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KÏhjh²hubeh}”(h]”Œheap-maintenance”ah ]”h"]”Œheap maintenance”ah$]”h&]”uh1hÈhjCh²hh³hÇh´KŸubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒRemoving Specific Elements”h]”hŒRemoving Specific Elements”…”�”}”(hjû h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjø h²hh³hÇh´KÒubj%)�”}”(hŒ3success = min_heap_del(heap, idx, callbacks, args);”h]”hŒ3success = min_heap_del(heap, idx, callbacks, args);”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj4‰j5j6j7}”uh1j$h³hÇh´KÔhjø h²hubjÚ)�”}”(hhh]”(jß)�”}”(hŒ$**heap**: A pointer to the min-heap.”h]”hþ)�”}”(hj h]”(j])�”}”(hŒ**heap**”h]”hŒheap”…”�”}”(hj" h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj ubhŒ: A pointer to the min-heap.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KØhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhj h²hh³hÇh´Nubjß)�”}”(hŒ,**idx**: The index of the element to delete.”h]”hþ)�”}”(hjB h]”(j])�”}”(hŒ**idx**”h]”hŒidx”…”�”}”(hjG h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjD ubhŒ%: The index of the element to delete.”…”�”}”(hjD h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KÙhj@ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhj h²hh³hÇh´Nubjß)�”}”(hŒc**callbacks**: A pointer to a `struct min_heap_callbacks` providing the `less` and `swp` functions.”h]”hþ)�”}”(hŒc**callbacks**: A pointer to a `struct min_heap_callbacks` providing the `less` and `swp` functions.”h]”(j])�”}”(hŒ **callbacks**”h]”hŒ callbacks”…”�”}”(hjm h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hji ubhŒ: A pointer to a ”…”�”}”(hji h²hh³Nh´NubjB)�”}”(hŒ`struct min_heap_callbacks`”h]”hŒstruct min_heap_callbacks”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhji ubhŒ providing the ”…”�”}”(hji h²hh³Nh´NubjB)�”}”(hŒ`less`”h]”hŒless”…”�”}”(hj‘ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhji ubhŒ and ”…”�”}”(hji h²hh³Nh´NubjB)�”}”(hŒ`swp`”h]”hŒswp”…”�”}”(hj£ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhji ubhŒ functions.”…”�”}”(hji h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KÚhje ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhj h²hh³hÇh´Nubjß)�”}”(hŒG**args**: Optional arguments passed to the `less` and `swp` functions. ”h]”hþ)�”}”(hŒF**args**: Optional arguments passed to the `less` and `swp` functions.”h]”(j])�”}”(hŒ**args**”h]”hŒargs”…”�”}”(hjÉ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjÅ ubhŒ#: Optional arguments passed to the ”…”�”}”(hjÅ h²hh³Nh´NubjB)�”}”(hŒ`less`”h]”hŒless”…”�”}”(hjÛ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjÅ ubhŒ and ”…”�”}”(hjÅ h²hh³Nh´NubjB)�”}”(hŒ`swp`”h]”hŒswp”…”�”}”(hjí h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjÅ ubhŒ functions.”…”�”}”(hjÅ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KÜhjÁ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhj h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j1j2uh1jÙh³hÇh´KØhjø h²hubhþ)�”}”(hŒ‰This macro removes an element at the specified index (`idx`) from the heap and restores the heap property. The operation is **O(log n)**.”h]”(hŒ6This macro removes an element at the specified index (”…”�”}”(hj h²hh³Nh´NubjB)�”}”(hŒ`idx`”h]”hŒidx”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj ubhŒA) from the heap and restores the heap property. The operation is ”…”�”}”(hj h²hh³Nh´Nubj])�”}”(hŒ **O(log n)**”h]”hŒO(log n)”…”�”}”(hj+ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj ubhŒ.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KÞhjø h²hubhþ)�”}”(hŒC**Inline Version:** min_heap_del_inline(heap, idx, callbacks, args)”h]”(j])�”}”(hŒ**Inline Version:**”h]”hŒInline Version:”…”�”}”(hjG h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hjC ubhŒ0 min_heap_del_inline(heap, idx, callbacks, args)”…”�”}”(hjC h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Káhjø h²hubeh}”(h]”Œremoving-specific-elements”ah ]”h"]”Œremoving specific elements”ah$]”h&]”uh1hÈhjCh²hh³hÇh´KÒubeh}”(h]”Œmacro-wrappers”ah ]”h"]”Œmacro wrappers”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KQubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒOther Utilities”h]”hŒOther Utilities”…”�”}”(hjr h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjo h²hh³hÇh´KäubjÚ)�”}”(hhh]”jß)�”}”(hŒP**min_heap_full(heap)**: Checks whether the heap is full. Complexity: **O(1)**. ”h]”hþ)�”}”(hŒO**min_heap_full(heap)**: Checks whether the heap is full. Complexity: **O(1)**.”h]”(j])�”}”(hŒ**min_heap_full(heap)**”h]”hŒmin_heap_full(heap)”…”�”}”(hj‹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj‡ ubhŒ/: Checks whether the heap is full. Complexity: ”…”�”}”(hj‡ h²hh³Nh´Nubj])�”}”(hŒ**O(1)**”h]”hŒO(1)”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj‡ ubhŒ.”…”�”}”(hj‡ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kæhjƒ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhj€ h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”j1j2uh1jÙh³hÇh´Kæhjo h²hubj%)�”}”(hŒ bool full = min_heap_full(heap);”h]”hŒ bool full = min_heap_full(heap);”…”�”}”hjÁ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj4‰j5j6j7}”uh1j$h³hÇh´Kéhjo h²hubjÚ)�”}”(hhh]”jß)�”}”(hŒ,`heap`: A pointer to the min-heap to check. ”h]”hþ)�”}”(hŒ+`heap`: A pointer to the min-heap to check.”h]”(jB)�”}”(hŒ`heap`”h]”hŒheap”…”�”}”(hjÛ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj× ubhŒ%: A pointer to the min-heap to check.”…”�”}”(hj× h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KíhjÓ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÞhjÐ h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”j1j2uh1jÙh³hÇh´Kíhjo h²hubhþ)�”}”(hŒAThis macro returns `true` if the heap is full, otherwise `false`.”h]”(hŒThis macro returns ”…”�”}”(hjÿ h²hh³Nh´NubjB)�”}”(hŒ`true`”h]”hŒtrue”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjÿ ubhŒ if the heap is full, otherwise ”…”�”}”(hjÿ h²hh³Nh´NubjB)�”}”(hŒ`false`”h]”hŒfalse”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhjÿ ubhŒ.”…”�”}”(hjÿ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kïhjo h²hubhþ)�”}”(hŒ.**Inline Version:** min_heap_full_inline(heap)”h]”(j])�”}”(hŒ**Inline Version:**”h]”hŒInline Version:”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j\hj1ubhŒ min_heap_full_inline(heap)”…”�”}”(hj1h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´Kñhjo h²hubeh}”(h]”Œother-utilities”ah ]”h"]”Œother utilities”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KäubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Example Usage”h]”hŒ Example Usage”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjUh²hh³hÇh´Kôubhþ)�”}”(hŒ�An example usage of the min-heap API would involve defining a heap structure, initializing it, and inserting and removing elements as needed.”h]”hŒ�An example usage of the min-heap API would involve defining a heap structure, initializing it, and inserting and removing elements as needed.”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hýh³hÇh´KöhjUh²hubj%)�”}”(hX(#include int my_less_function(const void *lhs, const void *rhs, void *args) { return (*(int *)lhs < *(int *)rhs); } struct min_heap_callbacks heap_cb = { .less = my_less_function, /* Comparison function for heap order */ .swp = NULL, /* Use default swap function */ }; void example_usage(void) { /* Pre-populate the buffer with elements */ int buffer[5] = {5, 2, 8, 1, 3}; /* Declare a min-heap */ DEFINE_MIN_HEAP(int, my_heap); /* Initialize the heap with preallocated buffer and size */ min_heap_init(&my_heap, buffer, 5); /* Build the heap using min_heapify_all */ my_heap.nr = 5; /* Set the number of elements in the heap */ min_heapify_all(&my_heap, &heap_cb, NULL); /* Peek at the top element (should be 1 in this case) */ int *top = min_heap_peek(&my_heap); pr_info("Top element: %d\n", *top); /* Pop the top element (1) and get the new top (2) */ min_heap_pop(&my_heap, &heap_cb, NULL); top = min_heap_peek(&my_heap); pr_info("New top element: %d\n", *top); /* Insert a new element (0) and recheck the top */ int new_element = 0; min_heap_push(&my_heap, &new_element, &heap_cb, NULL); top = min_heap_peek(&my_heap); pr_info("Top element after insertion: %d\n", *top); }”h]”hX(#include int my_less_function(const void *lhs, const void *rhs, void *args) { return (*(int *)lhs < *(int *)rhs); } struct min_heap_callbacks heap_cb = { .less = my_less_function, /* Comparison function for heap order */ .swp = NULL, /* Use default swap function */ }; void example_usage(void) { /* Pre-populate the buffer with elements */ int buffer[5] = {5, 2, 8, 1, 3}; /* Declare a min-heap */ DEFINE_MIN_HEAP(int, my_heap); /* Initialize the heap with preallocated buffer and size */ min_heap_init(&my_heap, buffer, 5); /* Build the heap using min_heapify_all */ my_heap.nr = 5; /* Set the number of elements in the heap */ min_heapify_all(&my_heap, &heap_cb, NULL); /* Peek at the top element (should be 1 in this case) */ int *top = min_heap_peek(&my_heap); pr_info("Top element: %d\n", *top); /* Pop the top element (1) and get the new top (2) */ min_heap_pop(&my_heap, &heap_cb, NULL); top = min_heap_peek(&my_heap); pr_info("New top element: %d\n", *top); /* Insert a new element (0) and recheck the top */ int new_element = 0; min_heap_push(&my_heap, &new_element, &heap_cb, NULL); top = min_heap_peek(&my_heap); pr_info("Top element after insertion: %d\n", *top); }”…”�”}”hjtsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj4‰j5j6j7}”uh1j$h³hÇh´KùhjUh²hubeh}”(h]”Œ example-usage”ah ]”h"]”Œ example usage”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´Kôubeh}”(h]”Œ min-heap-api”ah ]”h"]”Œ min heap api”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j¶Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j�j�j¿j¼j@j=j–j“j8j5jl ji j�j~j&j#j§j¤jjjõ jò jd ja jRjOjˆj…uŒ nametypes”}”(j�‰j¿‰j@‰j–‰j8‰jl ‰j�‰j&‰j§‰j‰jõ ‰jd ‰jR‰jˆ‰uh}”(j�hÊj¼j5j=jÂj“jÓj5j™ji jCj~jpj#j„j¤j)jjªjò jja jø jOjo j…jUuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.