All pastes #92283 Raw Edit

sauer_uint

public c v1 · immutable
#92283 ·published 2006-07-19 12:39 UTC
rendered paste body
#include <assert.h>#include <cstdlib>#include <iostream>using namespace std;struct sauer_uint_t{private:    void putuint(unsigned char* &p, int n)    {        if (n < 0 || n >= (1<<21))        {            *p++ = 0x80 | (n & 0x7F);            *p++ = 0x80 | ((n>>7) & 0x7F);            *p++ = 0x80 | ((n>>14) & 0x7F);            *p++ = ((n>>21) & 0xFF);        }        else if (n < (1<<7))         {            *p++ = n;        }        else if (n < (1<<14))        {            *p++ = 0x80 | (n & 0x7F);            *p++ = n >> 7;        }        else        {            *p++ = 0x80 | (n & 0x7F);            *p++ = 0x80 | ((n>>7) & 0x7F);            *p++ = (n>>14);        }    }            int getuint(unsigned char*&p)    {        int n = *p++;        if (!(n & (1 << 7))) return n;        n -= (1 << 7);        n = n | (*p++ << 7);        if (!(n & (1 << 14))) return n;        n -= (1 << 14);         n = n | (*p++ << 14);        if (!(n & (1 << 21))) return n;        n -= (1 << 21);        n = n | (*p++ << 21);        if (n & (1 << 28)) n |= 0xF0000000;        return n;    }        unsigned char m_data[4];    int m_size;public:    sauer_uint_t()    {        memset(&m_data, '\0', 4);        m_size = 1;    }        sauer_uint_t(sauer_uint_t& other)    {        memcpy(&m_data, &other.m_data, other.m_size);        m_size = other.m_size;    }        sauer_uint_t(unsigned char* data, int size)    {        memmove(&m_data, data, size);        m_size = size;    }        sauer_uint_t(int value)    {        if ( (((value >> 28) & 0xF) != 0x0)            && (((value >> 28) & 0xF) != 0xF) )        {            throw 0;        }                unsigned char* p = (unsigned char*)&m_data;        putuint(p, value);        m_size = p - ((unsigned char*)&m_data);    }        int to_uint()    {        unsigned char* p = (unsigned char*)&m_data;        return getuint(p);    }        void to_cout()    {        cout << "sauer_uint_t(" << to_uint() << ") ";        for(int i = 0; i < m_size; i++)        {            cout << (int)m_data[i] << " ";        }        cout << "\n";    }};void print_put(int value){    cout << value << "\n";    sauer_uint_t(value).to_cout();}void unit_test(){    for(int i = -1 * 0x0FFFFFFF; i < 0x0FFFFFF; i++)    {        if(sauer_uint_t(i).to_uint() != i)        {            cout << "OUPS " << i << "\n";        }    }}int main(int argc, char *argv[]){    //unit_test();        print_put(5);    print_put(100);    print_put(255);    print_put(1000);    print_put(-1);    print_put(-666);    print_put(-1234);    print_put(-9999);        system("PAUSE");    return EXIT_SUCCESS;}