/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * Copyright 2015 Danny Robson <danny@nerdcruft.net>
 */

#ifndef __UTIL_MEMORY_BUFFER_PAGED_HPP
#define __UTIL_MEMORY_BUFFER_PAGED_HPP

#include <cstddef>

namespace cruft::memory::buffer {
    class paged {
    public:
        using value_type = char;

        paged (size_t bytes, size_t window);
        ~paged ();

        paged (const paged&) = delete;
        paged (paged &&) = delete;
        paged& operator= (const paged&) = delete;
        paged& operator= (paged &&) = delete;

        char* begin (void)&;
        char* end   (void)&;

        const char* cbegin (void)&;
        const char* cend   (void)&;

        const char* begin (void) const&;
        const char* end   (void) const&;

        void access (char*);

        size_t size (void) const;
        size_t capacity (void) const;
        size_t window (void) const;

    private:
        void commit  (char*);
        void release (char*);

        char *m_begin, *m_end, *m_cursor;
        size_t m_window;
    };
}

#endif