#pragma once
#include "mf-utils.h"

template< MemType mem = MemType::CPU, buf_choose_policy choose_type = buf_choose_policy::naive >
class memory_pipe
{
private:
    std::vector<buffer > buff_vec;
public:
    memory_pipe(/* args */);
    ~memory_pipe();
    void set_available(const int id);
    std::vector<buffer >& get_buff_vec();
};

class memory_faucet
{
private:
    memory_faucet() = delete;
    memory_faucet(const memory_faucet&) = delete;
    memory_faucet& operator=(const memory_faucet&) = delete;

public:

    template< MemType mem = MemType::CPU, buf_choose_policy choose_type = buf_choose_policy::naive >
    static memory_pipe<mem, choose_type>& get_faucet();
};

template< MemType mem = MemType::CPU, buf_choose_policy choose_type = buf_choose_policy::naive >
class memBuf
{
private:
    void* buf;
    int id;
    size_t size;

public:
    memBuf(const size_t required_size);
    memBuf();
    ~memBuf();
    void* ptr();
    void** ptr();
    const void* ptr() const;
    void free_memory();
    int get_size() const;
    int get_id() const;
    void get_memory(const size_t required_size);
};