static fdpage_list_t raw_compress_fdpage_list()

in src/fdcache_page.cpp [68:122]


static fdpage_list_t raw_compress_fdpage_list(const fdpage_list_t& pages, bool ignore_load, bool ignore_modify, bool default_load, bool default_modify)
{
    fdpage_list_t compressed_pages;
    fdpage        tmppage;
    bool          is_first = true;
    for(fdpage_list_t::const_iterator iter = pages.begin(); iter != pages.end(); ++iter){
        if(!is_first){
            if(0 < tmppage.bytes){
                if( (!ignore_load   && (tmppage.loaded   != iter->loaded  )) ||
                    (!ignore_modify && (tmppage.modified != iter->modified)) )
                {
                    // Different from the previous area, add it to list
                    raw_add_compress_fdpage_list(compressed_pages, tmppage, ignore_load, ignore_modify, default_load, default_modify);

                    // keep current area
                    tmppage = fdpage(iter->offset, iter->bytes, (ignore_load ? default_load : iter->loaded), (ignore_modify ? default_modify : iter->modified));
                }else{
                    // Same as the previous area
                    if(tmppage.next() != iter->offset){
                        // These are not contiguous areas, add it to list
                        raw_add_compress_fdpage_list(compressed_pages, tmppage, ignore_load, ignore_modify, default_load, default_modify);

                        // keep current area
                        tmppage = fdpage(iter->offset, iter->bytes, (ignore_load ? default_load : iter->loaded), (ignore_modify ? default_modify : iter->modified));
                    }else{
                        // These are contiguous areas

                        // add current area
                        tmppage.bytes += iter->bytes;
                    }
                }
            }else{
                // if found empty page, skip it
                tmppage = fdpage(iter->offset, iter->bytes, (ignore_load ? default_load : iter->loaded), (ignore_modify ? default_modify : iter->modified));
            }
        }else{
            // first erea
            is_first = false;

            // keep current area
            tmppage = fdpage(iter->offset, iter->bytes, (ignore_load ? default_load : iter->loaded), (ignore_modify ? default_modify : iter->modified));
        }
    }
    // add last area
    if(!is_first){
        // [NOTE]
        // Zero size pages are not allowed. However, if it is the only one, allow it.
        // This is a special process that exists only to create empty files.
        //
        if(compressed_pages.empty() || 0 != tmppage.bytes){
            raw_add_compress_fdpage_list(compressed_pages, tmppage, ignore_load, ignore_modify, default_load, default_modify);
        }
    }
    return compressed_pages;
}