#include <tuple>
#include <random>
#include <functional>

typedef std::tuple<unsigned char,unsigned char,unsigned char> rgb_tuple;

class color_table{
public:
    void generate(std::function<rgb_tuple(const unsigned char&)> predicate);
    unsigned char red_table[255];
    unsigned char green_table[255];
    unsigned char blue_table[255];
};

template <class RANDOM>
static rgb_tuple random_color(RANDOM engine){
    std::uniform_int_distribution<int> dist1 (0,255);
    unsigned char red   = (unsigned char) dist1(engine);
    unsigned char green = (unsigned char) dist1(engine);
    unsigned char blue  = (unsigned char) dist1(engine);
    return std::make_tuple(red, green, blue);
}

template <class RANDOM>
static color_table create_random_color_map(RANDOM engine){
    color_table lut;
    lut.generate([&](const unsigned char& i)->rgb_tuple {
        return random_color(engine);
    } );
    return lut;
}

void color_table::generate(std::function<rgb_tuple(const unsigned char&)> predicate){
    for(int i = 0; i < 256; ++i){
        std::tie(red_table[i], green_table[i], blue_table[i]) = predicate(i);
    }
}

int main()
{
    std::mt19937 engine;
    create_random_color_map(engine);
}
