# This upgrader moves memory pool attributes from a vector of pointers to the
# next free page and a vector of the limit of each pool to sections which each
# represent one pool and which hold the page shift amount, the next free page,
# and the total pages in the pool.
def upgrader(cpt):
    systems = {}
    for sec in cpt.sections():
        ptrs = cpt.get(sec, "ptrs", fallback=None)
        limits = cpt.get(sec, "limits", fallback=None)

        if ptrs and limits:
            systems[sec] = ptrs, limits

    for sec, (ptrs, limits) in systems.items():

        ptrs = list(map(int, ptrs.split()))
        limits = list(map(int, limits.split()))

        if len(ptrs) != len(limits):
            print(
                f"'{sec}ptrs' and '{limits}limits' were not the same length!"
            )

        cpt.set(sec, "num_mem_pools", str(len(ptrs)))

        cpt.remove_option(sec, "ptrs")
        cpt.remove_option(sec, "limits")

        # Assume the page shift is 12, for a 4KiB page.
        page_shift = 12

        for idx, (ptr, limit) in enumerate(zip(ptrs, limits)):
            new_sec = f"{sec}.memPool{idx}"
            cpt.add_section(new_sec)
            cpt.set(new_sec, "page_shift", str(page_shift))
            # Since there's no way to tell where the pool actually started,
            # just assume it started wherever it is right now.
            cpt.set(new_sec, "start_page", str(ptr >> page_shift))
            cpt.set(new_sec, "free_page_num", str(ptr >> page_shift))
            cpt.set(new_sec, "total_pages", str((limit - ptr) >> page_shift))
