src/types/IntegerDataTypeWriter.h
branchv_0
changeset 45 27d5335cd924
parent 44 3f7b5f3f3f84
child 54 d9c68ac8929e
equal deleted inserted replaced
44:3f7b5f3f3f84 45:27d5335cd924
    34 
    34 
    35 using namespace relpipe::protocol;
    35 using namespace relpipe::protocol;
    36 using namespace relpipe::writer;
    36 using namespace relpipe::writer;
    37 
    37 
    38 /**
    38 /**
    39  * Unsigned variable-length integer.
    39  * Signed variable-length integer.
    40  * ULEB128
    40  * LEB128
    41  */
    41  */
    42 class IntegerDataTypeWriter : public DataTypeWriter<integer_t> {
    42 class IntegerDataTypeWriter : public DataTypeWriter<integer_t> {
    43 public:
    43 public:
    44 
    44 
    45 	IntegerDataTypeWriter() : DataTypeWriter<integer_t>(TypeId::INTEGER, DATA_TYPE_CODE_INTEGER) {
    45 	IntegerDataTypeWriter() : DataTypeWriter<integer_t>(TypeId::INTEGER, DATA_TYPE_CODE_INTEGER) {
    46 	}
    46 	}
    47 
    47 
    48 	void writeValue(std::ostream &output, const integer_t &value) override {
    48 	void writeValue(std::ostream &output, const integer_t &value) override {
    49 		integer_t v = value;
    49 		integer_t v = value;
       
    50 		bool more;
    50 		do {
    51 		do {
    51 			octet_t octet = v & 0x7F;
    52 			octet_t octet = v & 0x7F;
    52 			v >>= 7;
    53 			v >>= 7;
    53 			if (v) octet |= 0x80; // more bytes follow
    54 			more = !(((v == 0) && ((octet & 0x40) == 0)) || ((v == -1) && ((octet & 0x40) != 0)));
       
    55 			if (more) octet |= 0x80; // more bytes follow
    54 			output << char(octet);
    56 			output << char(octet);
    55 		} while (v);
    57 		} while (more);
    56 	}
    58 	}
    57 
    59 
    58 	integer_t toValue(const string_t &stringValue) override {
    60 	integer_t toValue(const string_t &stringValue) override {
    59 		// throws „terminate called after throwing an instance of 'std::invalid_argument'“ SIGABRT, core dumped on invalid number
    61 		// throws „terminate called after throwing an instance of 'std::invalid_argument'“ SIGABRT, core dumped on invalid number
    60 		return stoul(stringValue);
    62 		return stol(stringValue);
    61 	}
    63 	}
    62 
    64 
    63 };
    65 };
    64 
    66 
    65 }
    67 }