remove __PICONTAINERS_SIMPLE_TYPE__ #44
Reference in New Issue
Block a user
Delete Branch "experiment"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Я тут посмотрел, оставил свои замечания
@@ -142,0 +124,4 @@//! \relatesalso PIByteArray \brief Byte arrays compare operatorinline bool operator <(const PIByteArray & v0, const PIByteArray & v1) {if (v0.size() == v1.size()) {for (uint i = 0; i < v0.size(); ++i)надо бы заменить на memcmp
по тестам memcmp профита не даёт
@@ -142,0 +136,4 @@inline bool operator ==(PIByteArray & f, PIByteArray & s) {if (f.size_s() != s.size_s())return false;for (int i = 0; i < f.size_s(); ++i)надо бы заменить на memcmp
@@ -142,0 +146,4 @@inline bool operator !=(PIByteArray & f, PIByteArray & s) {if (f.size_s() != s.size_s())return true;for (int i = 0; i < f.size_s(); ++i)надо бы заменить на memcmp
@@ -154,0 +166,4 @@// store operators for basic types#define PBA_OPERATOR_TO int os = s.size_s(); s.enlarge(sizeof(v)); memcpy(s.data(os), &v, sizeof(v));а этот макрос теперь нужен вообще? он же в 1м месте только
в 3
у тебя на 3 строки 5 строк описания дефайна, мне это кажется нелогичным, не говоря от том что макросы нужно использовать только по необходимости, коей здесь не видно
@@ -190,1 +259,4 @@// restore operators for basic types#define PBA_OPERATOR_FROM memcpy((void*)(&v), s.data(), sizeof(v)); s.remove(0, sizeof(v));этот макрос тоже теперь не нужен?
тем более они потом undefine, в чем проблема?
не читаемый код получается, и к тому же кода больше чем если ты эту строку вставишь в функцию
@@ -221,3 +281,4 @@template<typename T> inline PIByteArray & operator >>(PIByteArray & s, PIFlags<T> & v) {PBA_OPERATOR_FROM return s;}//! \relatesalso PIByteArray \brief Restore operator, see \ref PIByteArray_sec1 for detailsPIP_EXPORT PIByteArray & operator >>(PIByteArray & s, PIByteArray & v);а почему этот оператор не inline, а оператор << inline?
потому что реализован в cpp, и 20 строк, большой
оператор « маленький что ли?
@@ -323,1 +446,3 @@__PIBYTEARRAY_SIMPLE_TYPE__(PIChar)template<typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>inline PIByteArray & operator <<(PIByteArray & s, const T & ) {static_assert(std::is_trivially_copyable<T>::value, "[PIByteArray] Error: using undeclared operator << for complex type!");Пихать в static_assert std::is_trivially_copyable::value мне кажется лишним, другой туда не попадёт, наглядней будет static_assert(false) или static_assert(0). Ещё предлагаю в сообщение запихнуть имя типа, а то не понятно на что он сработал.
нет, не трогай. с false он для всех типов стреляет ассертом. имя типа как мы получим, это ж компил-тайм?
а typeid это разве не компил тайм?
зачем вообще тип выводить если тебе ошибка дана на место в коде, сходи и посмотри
@@ -324,1 +451,4 @@template<typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>inline PIByteArray & operator >>(PIByteArray & s, T & ) {static_assert(std::is_trivially_copyable<T>::value, "[PIByteArray] Error: using undeclared operator >> for complex type!");аналогично предыдущему
@@ -0,0 +47,4 @@template<typename T>class __VariantFunctions__: public __VariantFunctionsBase__ {public:__VariantFunctionsBase__ * instance() override {static __VariantFunctions__<T> ret; return &ret;}тут правильнее во всех функциях использовать final вместо override
ok
@@ -0,0 +52,4 @@uint hash() const override {static uint ret = typeName().hash(); return ret;}void newT(void *& ptr, const void * value) override {ptr = (void*)(new T(*(const T*)value)); /*printf(" * new\n")*/;}void newNullT(void *& ptr) override {ptr = (void*)(new T());/* printf(" * new null\n")*/;}void equalT(void *& ptr, const void * value) override {*(T*)ptr = *(const T*)value; /*printf(" * =\n")*/;}правильнее назвать функцию assign
ok