#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <string>
#include <random>
#include <functional>
 
template <typename DataType = uint32_t>
using randomizer_t = std::independent_bits_engine<
                     std::default_random_engine,
                     sizeof(DataType)*4, DataType>;
 
template <class T, class Compare>
constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp )
{
    return comp(v, hi) ? std::max(v, lo, comp) : std::min(v, hi, comp);
}

template <class T>
constexpr const T& clamp( const T& v, const T& lo, const T& hi )
{
    return clamp( v, lo, hi, std::less<>() );
}

int main() {
    
    std::vector<int> vec(25);
    randomizer_t<uint32_t> randomizer;
 
    std::generate(std::begin(vec),
                  std::end(vec),
                  std::ref(randomizer));
 
    std::for_each(std::begin(vec),
                  std::end(vec),
                  [](int datapoint) {
        
        std::cout << "         raw value: " << datapoint << std::endl
                  << " clamped to int8_t: " << clamp(datapoint, -128, 127) << std::endl
                  << "clamped to uint8_t: " << clamp(datapoint, 0, 255) << std::endl
                  << std::endl;
    });
    
    return 0;
}