#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);
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnR5cGVkZWYgc3RkOjp0dXBsZTx1bnNpZ25lZCBjaGFyLHVuc2lnbmVkIGNoYXIsdW5zaWduZWQgY2hhcj4gcmdiX3R1cGxlOwoKY2xhc3MgY29sb3JfdGFibGV7CnB1YmxpYzoKICAgIHZvaWQgZ2VuZXJhdGUoc3RkOjpmdW5jdGlvbjxyZ2JfdHVwbGUoY29uc3QgdW5zaWduZWQgY2hhciYpPiBwcmVkaWNhdGUpOwogICAgdW5zaWduZWQgY2hhciByZWRfdGFibGVbMjU1XTsKICAgIHVuc2lnbmVkIGNoYXIgZ3JlZW5fdGFibGVbMjU1XTsKICAgIHVuc2lnbmVkIGNoYXIgYmx1ZV90YWJsZVsyNTVdOwp9OwoKdGVtcGxhdGUgPGNsYXNzIFJBTkRPTT4Kc3RhdGljIHJnYl90dXBsZSByYW5kb21fY29sb3IoUkFORE9NIGVuZ2luZSl7CiAgICBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IGRpc3QxICgwLDI1NSk7CiAgICB1bnNpZ25lZCBjaGFyIHJlZCAgID0gKHVuc2lnbmVkIGNoYXIpIGRpc3QxKGVuZ2luZSk7CiAgICB1bnNpZ25lZCBjaGFyIGdyZWVuID0gKHVuc2lnbmVkIGNoYXIpIGRpc3QxKGVuZ2luZSk7CiAgICB1bnNpZ25lZCBjaGFyIGJsdWUgID0gKHVuc2lnbmVkIGNoYXIpIGRpc3QxKGVuZ2luZSk7CiAgICByZXR1cm4gc3RkOjptYWtlX3R1cGxlKHJlZCwgZ3JlZW4sIGJsdWUpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgUkFORE9NPgpzdGF0aWMgY29sb3JfdGFibGUgY3JlYXRlX3JhbmRvbV9jb2xvcl9tYXAoUkFORE9NIGVuZ2luZSl7CiAgICBjb2xvcl90YWJsZSBsdXQ7CiAgICBsdXQuZ2VuZXJhdGUoWyZdKGNvbnN0IHVuc2lnbmVkIGNoYXImIGkpLT5yZ2JfdHVwbGUgewogICAgICAgIHJldHVybiByYW5kb21fY29sb3IoZW5naW5lKTsKICAgIH0gKTsKICAgIHJldHVybiBsdXQ7Cn0KCnZvaWQgY29sb3JfdGFibGU6OmdlbmVyYXRlKHN0ZDo6ZnVuY3Rpb248cmdiX3R1cGxlKGNvbnN0IHVuc2lnbmVkIGNoYXImKT4gcHJlZGljYXRlKXsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCAyNTY7ICsraSl7CiAgICAgICAgc3RkOjp0aWUocmVkX3RhYmxlW2ldLCBncmVlbl90YWJsZVtpXSwgYmx1ZV90YWJsZVtpXSkgPSBwcmVkaWNhdGUoaSk7CiAgICB9Cn0KCmludCBtYWluKCkKewogICAgc3RkOjptdDE5OTM3IGVuZ2luZTsKICAgIGNyZWF0ZV9yYW5kb21fY29sb3JfbWFwKGVuZ2luZSk7Cn0K