Skip to content

Commit 8879afb

Browse files
committed
Make APIs fully symmetrical
while writeSigned and writeUnsigned are in most cases identical, having these methods makes it easier to verify usages of this code, as well as codegen and making the code more descriptive.
1 parent 8755a98 commit 8879afb

File tree

3 files changed

+41
-33
lines changed

3 files changed

+41
-33
lines changed

encoding.cpp

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -284,12 +284,13 @@ static inline zend_string* extendBuffer(zend_string* buffer, size_t offset, size
284284
return buffer;
285285
}
286286

287-
static zend_string* writeByte(zend_string* buffer, size_t& offset, int8_t value) {
288-
buffer = extendBuffer(buffer, offset, sizeof(int8_t));
287+
template<typename TValue>
288+
static zend_string* writeByte(zend_string* buffer, size_t& offset, TValue value) {
289+
buffer = extendBuffer(buffer, offset, sizeof(TValue));
289290

290291
ZSTR_VAL(buffer)[offset] = *reinterpret_cast<char*>(&value);
291292

292-
offset += sizeof(int8_t);
293+
offset += sizeof(TValue);
293294

294295
return buffer;
295296
}
@@ -655,45 +656,52 @@ PHP_RINIT_FUNCTION(encoding)
655656
/* }}} */
656657

657658
#define READ_FIXED_TYPE_FENTRY(zend_name, native_type, result_wrapper, arg_info) \
658-
ZEND_RAW_FENTRY(zend_name "LE", (zif_readType<native_type, (readFixedSizeType<native_type, ByteOrder::LittleEndian>), result_wrapper>), arg_info, ZEND_ACC_PUBLIC) \
659-
ZEND_RAW_FENTRY(zend_name "BE", (zif_readType<native_type, (readFixedSizeType<native_type, ByteOrder::BigEndian>), result_wrapper>), arg_info, ZEND_ACC_PUBLIC)
659+
ZEND_RAW_FENTRY("read" zend_name "LE", (zif_readType<native_type, (readFixedSizeType<native_type, ByteOrder::LittleEndian>), result_wrapper>), arg_info, ZEND_ACC_PUBLIC) \
660+
ZEND_RAW_FENTRY("read" zend_name "BE", (zif_readType<native_type, (readFixedSizeType<native_type, ByteOrder::BigEndian>), result_wrapper>), arg_info, ZEND_ACC_PUBLIC)
660661

661662
#define READ_VARINT_FENTRY(size_name, unsigned_type, signed_type) \
662663
ZEND_RAW_FENTRY("readUnsignedVar" size_name, (zif_readType<unsigned_type, (readUnsignedVarInt<unsigned_type>), zval_long_wrapper>), arginfo_read_integer, ZEND_ACC_PUBLIC) \
663664
ZEND_RAW_FENTRY("readSignedVar" size_name, (zif_readType<signed_type, (readSignedVarInt<unsigned_type, signed_type>), zval_long_wrapper>), arginfo_read_integer, ZEND_ACC_PUBLIC)
664665

665666
#define WRITE_FIXED_TYPE_FENTRY(zend_name, native_type, parse_parameters_wrapper, arg_info) \
666-
ZEND_RAW_FENTRY(zend_name "LE", (zif_writeType<native_type, parse_parameters_wrapper<native_type>, (writeFixedSizeType<native_type, ByteOrder::LittleEndian>)>), arg_info, ZEND_ACC_PUBLIC) \
667-
ZEND_RAW_FENTRY(zend_name "BE", (zif_writeType<native_type, parse_parameters_wrapper<native_type>, (writeFixedSizeType<native_type, ByteOrder::BigEndian>)>), arg_info, ZEND_ACC_PUBLIC)
667+
ZEND_RAW_FENTRY("write" zend_name "LE", (zif_writeType<native_type, parse_parameters_wrapper<native_type>, (writeFixedSizeType<native_type, ByteOrder::LittleEndian>)>), arg_info, ZEND_ACC_PUBLIC) \
668+
ZEND_RAW_FENTRY("write" zend_name "BE", (zif_writeType<native_type, parse_parameters_wrapper<native_type>, (writeFixedSizeType<native_type, ByteOrder::BigEndian>)>), arg_info, ZEND_ACC_PUBLIC)
668669

669670
#define WRITE_VARINT_FENTRY(size_name, unsigned_type, signed_type) \
670671
ZEND_RAW_FENTRY("writeUnsignedVar" size_name, (zif_writeType<unsigned_type, zend_parse_parameters_long_wrapper<unsigned_type>, (writeUnsignedVarInt<unsigned_type>)>), arginfo_write_integer, ZEND_ACC_PUBLIC) \
671672
ZEND_RAW_FENTRY("writeSignedVar" size_name, (zif_writeType<signed_type, zend_parse_parameters_long_wrapper<signed_type>, (writeSignedVarInt<unsigned_type, signed_type>)>), arginfo_write_integer, ZEND_ACC_PUBLIC)
672673

674+
#define READ_WRITE_LONG_ENTRY(zend_name, unsigned_native, signed_native) \
675+
READ_FIXED_TYPE_FENTRY("Unsigned" zend_name, unsigned_native, zval_long_wrapper, arginfo_read_integer) \
676+
READ_FIXED_TYPE_FENTRY("Signed" zend_name, signed_native, zval_long_wrapper, arginfo_read_integer) \
677+
WRITE_FIXED_TYPE_FENTRY("Unsigned" zend_name, unsigned_native, zend_parse_parameters_long_wrapper, arginfo_write_integer) \
678+
WRITE_FIXED_TYPE_FENTRY("Signed" zend_name, signed_native, zend_parse_parameters_long_wrapper, arginfo_write_integer)
679+
680+
#define READ_WRITE_FLOAT_ENTRY(zend_name, native_type) \
681+
READ_FIXED_TYPE_FENTRY(zend_name, native_type, zval_double_wrapper, arginfo_read_float) \
682+
WRITE_FIXED_TYPE_FENTRY(zend_name, native_type, zend_parse_parameters_double_wrapper, arginfo_write_float)
683+
684+
#define READ_WRITE_VARINT_ENTRY(zend_name, unsigned_type, signed_type) \
685+
READ_VARINT_FENTRY(zend_name, unsigned_type, signed_type) \
686+
WRITE_VARINT_FENTRY(zend_name, unsigned_type, signed_type)
687+
688+
#define READ_WRITE_BYTE_ENTRY(zend_name, native_type) \
689+
ZEND_RAW_FENTRY("read" zend_name, (zif_readType<native_type, readByte<native_type>, zval_long_wrapper>), arginfo_read_integer, ZEND_ACC_PUBLIC) \
690+
ZEND_RAW_FENTRY("write" zend_name, (zif_writeType<native_type, zend_parse_parameters_long_wrapper<native_type>, writeByte<native_type>>), arginfo_write_integer, ZEND_ACC_PUBLIC)
691+
673692
static zend_function_entry byte_buffer_methods[] = {
674-
ZEND_RAW_FENTRY("readUnsignedByte", (zif_readType<uint8_t, readByte<uint8_t>, zval_long_wrapper>), arginfo_read_integer, ZEND_ACC_PUBLIC)
675-
ZEND_RAW_FENTRY("readSignedByte", (zif_readType<int8_t, readByte<int8_t>, zval_long_wrapper>), arginfo_read_integer, ZEND_ACC_PUBLIC)
676-
677-
READ_FIXED_TYPE_FENTRY("readUnsignedShort", uint16_t, zval_long_wrapper, arginfo_read_integer)
678-
READ_FIXED_TYPE_FENTRY("readSignedShort", int16_t, zval_long_wrapper, arginfo_read_integer)
679-
READ_FIXED_TYPE_FENTRY("readUnsignedInt", uint32_t, zval_long_wrapper, arginfo_read_integer)
680-
READ_FIXED_TYPE_FENTRY("readSignedInt", int32_t, zval_long_wrapper, arginfo_read_integer)
681-
READ_FIXED_TYPE_FENTRY("readSignedLong", uint64_t, zval_long_wrapper, arginfo_read_integer)
682-
READ_FIXED_TYPE_FENTRY("readFloat", float, zval_double_wrapper, arginfo_read_float)
683-
READ_FIXED_TYPE_FENTRY("readDouble", double, zval_double_wrapper, arginfo_read_float)
684-
685-
READ_VARINT_FENTRY("Int", uint32_t, int32_t)
686-
READ_VARINT_FENTRY("Long", uint64_t, int64_t)
687-
688-
ZEND_RAW_FENTRY("writeByte", (zif_writeType<int8_t, zend_parse_parameters_long_wrapper<int8_t>, writeByte>), arginfo_write_integer, ZEND_ACC_PUBLIC)
689-
WRITE_FIXED_TYPE_FENTRY("writeShort", int16_t, zend_parse_parameters_long_wrapper, arginfo_write_integer)
690-
WRITE_FIXED_TYPE_FENTRY("writeInt", int32_t, zend_parse_parameters_long_wrapper, arginfo_write_integer)
691-
WRITE_FIXED_TYPE_FENTRY("writeLong", int64_t, zend_parse_parameters_long_wrapper, arginfo_write_integer)
692-
WRITE_FIXED_TYPE_FENTRY("writeFloat", float, zend_parse_parameters_double_wrapper, arginfo_write_float)
693-
WRITE_FIXED_TYPE_FENTRY("writeDouble", double, zend_parse_parameters_double_wrapper, arginfo_write_float)
694-
695-
WRITE_VARINT_FENTRY("Int", uint32_t, int32_t)
696-
WRITE_VARINT_FENTRY("Long", uint64_t, int64_t)
693+
READ_WRITE_BYTE_ENTRY("UnsignedByte", uint8_t)
694+
READ_WRITE_BYTE_ENTRY("SignedByte", int8_t)
695+
696+
READ_WRITE_LONG_ENTRY("Short", uint16_t, int16_t)
697+
READ_WRITE_LONG_ENTRY("Int", uint32_t, int32_t)
698+
READ_WRITE_LONG_ENTRY("Long", uint64_t, int64_t)
699+
700+
READ_WRITE_FLOAT_ENTRY("Float", float)
701+
READ_WRITE_FLOAT_ENTRY("Double", double)
702+
703+
READ_WRITE_VARINT_ENTRY("Int", uint32_t, int32_t)
704+
READ_WRITE_VARINT_ENTRY("Long", uint64_t, int64_t)
697705

698706
PHP_ME(ByteBuffer, __construct, ByteBuffer___construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
699707
PHP_ME(ByteBuffer, toString, ByteBuffer_toString, ZEND_ACC_PUBLIC)

tests/buffer-to-string.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ ByteBuffer may allocate more bytes than it needs in order to minimize allocation
66
<?php
77

88
$buffer = new ByteBuffer("");
9-
$buffer->writeIntBE(0); //first buffer alloc, 4 bytes
10-
$buffer->writeByte(0); //second buffer alloc, 8 bytes (used 5)
9+
$buffer->writeSignedIntBE(0); //first buffer alloc, 4 bytes
10+
$buffer->writeSignedByte(0); //second buffer alloc, 8 bytes (used 5)
1111

1212
var_dump(bin2hex($buffer->toString()));
1313

tests/reserve.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ $buffer->reserve(40);
1010
var_dump($buffer->getReserved()); //40
1111
var_dump($buffer->toString()); //still empty, we haven't used any space
1212

13-
$buffer->writeByte(ord("a"));
13+
$buffer->writeSignedByte(ord("a"));
1414
var_dump($buffer->getReserved()); //40
1515
var_dump($buffer->toString());
1616

0 commit comments

Comments
 (0)