src/types/IntegerDataTypeReader.h
branchv_0
changeset 46 12c329f5524f
parent 45 24a506eb97b5
child 52 d22e9274fcad
equal deleted inserted replaced
45:24a506eb97b5 46:12c329f5524f
    36 
    36 
    37 using namespace relpipe::protocol;
    37 using namespace relpipe::protocol;
    38 using namespace relpipe::reader;
    38 using namespace relpipe::reader;
    39 
    39 
    40 /**
    40 /**
    41  * Unsigned variable-length integer.
    41  * Signed variable-length integer.
    42  * ULEB128
    42  * LEB128
    43  */
    43  */
    44 class IntegerDataTypeReader : public DataTypeReader<integer_t> {
    44 class IntegerDataTypeReader : public DataTypeReader<integer_t> {
    45 private:
    45 private:
    46 
    46 
    47 	uint8_t readNextOctet(std::istream &input) {
    47 	octet_t readNextOctet(std::istream &input) {
    48 		uint8_t value = input.get();
    48 		octet_t value = input.get();
    49 		if (input.good()) return value;
    49 		if (input.good()) return value;
    50 		else throw RelpipeReaderException(L"Unable to read next octet of the integer.");
    50 		else throw RelpipeReaderException(L"Unable to read next octet of the integer.");
    51 	}
    51 	}
    52 
    52 
    53 public:
    53 public:
    62 		do {
    62 		do {
    63 			octet = readNextOctet(input);
    63 			octet = readNextOctet(input);
    64 			value += integer_t(octet & 0x7F) << shift;
    64 			value += integer_t(octet & 0x7F) << shift;
    65 			shift += 7;
    65 			shift += 7;
    66 		} while (octet >= 128);
    66 		} while (octet >= 128);
       
    67 
       
    68 		if ((shift < (sizeof (integer_t) * 8)) && (octet & 0x40))
       
    69 			value |= (~0 << shift);
    67 		return value;
    70 		return value;
    68 	}
    71 	}
    69 
    72 
    70 	string_t toString(const integer_t &value) override {
    73 	string_t toString(const integer_t &value) override {
    71 		return std::to_wstring(value);
    74 		return std::to_wstring(value);