- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 100
#ifndef RPCCALL_H
#define RPCCALL_H
#include <deque>
#include <typeinfo>
#include <string>
#include "byteinbuffer.h"
#include <byteoutbuffer.h>
#include <ostream>
class RPCPack
{
public:
RPCPack();
//RPCPack(const RPCPack &obj);
RPCPack(RPCPack && obj);
RPCPack & operator = (RPCPack&& obj);
template<class T, typename std::enable_if<
std::is_pod<T>::value && !std::is_pointer<T>::value>::type* = nullptr>
bool pack(const T& param);
template <class T,typename std::enable_if<
std::is_same<typename T::iterator::iterator_category,std::random_access_iterator_tag>::value>::type* = nullptr>
bool pack(const T& param);
template <class T,typename std::enable_if<
std::is_same<typename T::iterator::iterator_category,std::bidirectional_iterator_tag>::value>::type* = nullptr>
bool pack(const T& param);
template <class T,typename std::enable_if<
std::is_same<typename T::iterator::iterator_category,std::forward_iterator_tag>::value>::type* = nullptr>
bool pack(const T& param);
template<class D,class ... T >
bool pack(const D& param,const T& ... params);
template<class ... T>
bool pack(const T& ... params);
template<class T, typename std::enable_if<
std::is_pod<T>::value && !std::is_pointer<T>::value && !std::is_array<T>::value>::type* = nullptr>
bool unpack(T& param);
template <class T,typename std::enable_if<
std::is_same<typename T::iterator::iterator_category,std::random_access_iterator_tag>::value>::type* = nullptr>
bool unpack(T& param);
template <class T,typename std::enable_if<
std::is_same<typename T::iterator::iterator_category,std::bidirectional_iterator_tag>::value>::type* = nullptr>
bool unpack(T& param);
template <class T,typename std::enable_if<
std::is_same<typename T::iterator::iterator_category,std::forward_iterator_tag>::value>::type* = nullptr>
bool unpack(T& param);
template<class D,class ... T >
bool unpack(D& param, T& ... params);
template<class ... T>
bool unpack(T& ... params);
template <class T,class D>
bool pack(const std::pair<T,D> & p);
template <class T,class D>
bool unpack(std::pair<T,D>& p);
std::vector<char> getSerialized();
void deserialize(std::istream &vs);
size_t getSize();
bool isEmpty();
void copyOuttoIn();
void moveOuttoIn();
ByteOutBuffer<char> getBuffer() const;
void setBuffer(const ByteOutBuffer<char> &value);
private:
std::deque<size_t> sig;
std::vector<char> outdata;
std::vector<char> indata;
ByteOutBuffer<char> outbuffer;
ByteInBuffer<char> inbuffer;
std::istream is;
std::ostream os;
};
template<class T, typename std::enable_if<
std::is_pod<T>::value && !std::is_pointer<T>::value>::type*>
bool RPCPack::pack(const T& param)
{
sig.push_back(typeid(param).hash_code());
if(os.write((char*)¶m,sizeof(param)))
return true;
return false;
}
template <class T,class D>
bool RPCPack::pack(const std::pair<T,D>& param)
{
return pack(param.first) & pack(param.second);
}
template <class T,class D>
Хуячу сериализацию. Я метапрограммер)
guestinho 16.01.2017 16:50 # +2
Зачем ты его написал? Это шутка или всерьез? Ведь если ты запостил его сюда, то понимаешь, что это говно. Было бы интересно послушать, что именно ты думаешь о своем творении. Какие именно места тебе кажутся плохими? Или ты запостил его, чтобы похвастаться?
Koshak90 16.01.2017 16:55 # 0
guestinho 16.01.2017 17:49 # +3
1) Ты захардкодил методы pack и unpack в классе вместо того, чтобы сделать их свободными функциями и дать пользователю возможность переопределять их для своих типов.
2) Очевидно, твой сериализатор сосет по перфомансу, потому что данные 100500 раз копируются между буферами, дофига аллокаций из кучи, которые пользователь не контролирует, используются стремные иостримы. Хороший сериализатор не аллоцирует вектор, а пишет в буфер или стрим пользователя.
3) Непонятно, почему в одном классе смешана в кучу сериализация и десериализация.
4) Твоя сериализация не только зависит от архитектуры (порядок байт в структурах), она зависит от компилятора (паддинг).
5) > pack(param.first) & pack(param.second)
Выучи разницу между битовыми и логическими операциями.
Koshak90 16.01.2017 18:08 # 0
roman-kashitsyn 16.01.2017 17:11 # +4
Вот так изящно всё, что уже сериализовано на диск, превращается в мусор, когда в структурке добавляются / меняются поля.
Чего только люди не придумают, лишь бы не использовать Protocol Buffers / https://capnproto.org/ и прочие MMS
guestinho 16.01.2017 17:18 # +3
На самом деле это я сказал, прикрывшись снаутом.
roman-kashitsyn 16.01.2017 17:24 # 0
А где в protobuf-е схема рядом с данными?
guestinho 16.01.2017 17:36 # 0
https://developers.google.com/protocol-buffers/docs/encoding#structure
roman-kashitsyn 16.01.2017 17:52 # 0
bormand 16.01.2017 17:58 # 0
roman-kashitsyn 16.01.2017 18:21 # +3
bormand 16.01.2017 18:28 # 0
guestinho 16.01.2017 18:06 # +2
> чтение новой версии данных старой версией софта
Ну это в каких-то случаях так, а в каких-то не так. Если нужно на сервере обеспечить поддержку старых клиентов, то можно просто договариваться об используемой версии протокола во время хэндшейка или типа того.
Мне кажется, что подход протобуфа более костыле-ориентированный и опасный, а версионирование - просто и надежно.
roman-kashitsyn 16.01.2017 18:20 # +1
Я говорю о чтении старой версией программы данных, которые были записаны с новой версией схемы. Никакого сервера при этом нет.
> подход протобуфа более костыле-ориентированный
Если есть 100500 batch-задач, которые обрабатывают массив данных, записанный другой программой, то такой подход очень даже хорошо работает. Именно в таких условиях протобуф и создавали.
guestinho 16.01.2017 18:31 # 0
А то я видел, как некоторые товарищи воспринимают протобуф, как серебрянную пулю, решающую проблему обратной совместимости, а потом "ой, ну мы тут протокол сломали, обновитесь".
Koshak90 16.01.2017 17:31 # 0
roman-kashitsyn 16.01.2017 17:54 # +1
Разница не принципиальна. Вполне может оказаться, что на разных концах канала передачи данных разные версии софта.
bormand 16.01.2017 17:55 # +3
Для сетки, имхо, даже хуже ;)
На диске это ещё можно было бы списать на пирфоманс (у той же постгри, емнип, базу нельзя таскать на другие машины из-за такой вот привязки к архитектуре/компилеру). А в сетке как минимум машины с x86 и amd64 обязательно попадутся...
Koshak90 16.01.2017 18:23 # 0
CHayT 16.01.2017 18:32 # +2
Инфа 100%?
bormand 16.01.2017 18:32 # +4
guestinho 16.01.2017 18:34 # +2
bormand 16.01.2017 18:52 # +1
barop 16.01.2017 18:53 # +2
bormand 16.01.2017 18:54 # +2
barop 16.01.2017 19:12 # +2
Они не умели VCS, не умели модульность, и каждую свой мегапроект писали с нуля.
Ну правда это были школьники (в буквальном смысле) ;)
bormand 16.01.2017 19:16 # +2
А у меня на приставке с бейсиком некуда было сохранять проги...
barop 16.01.2017 19:17 # +1
А ее легко было набрать по памяти. Все семь строк.
guestinho 16.01.2017 19:19 # +3
dxd 16.01.2017 19:46 # 0
CHayT 16.01.2017 17:57 # +5
Koshak90 16.01.2017 17:59 # 0
bormand 16.01.2017 18:00 # +3
Как что-то плохое. Не хотеть писать свою реализацию ASN.1 - совершенно нормально.
З.Ы. Готовые либы запрещено юзать?
Koshak90 16.01.2017 18:04 # 0
bormand 16.01.2017 18:05 # +2
Koshak90 16.01.2017 18:09 # 0
Dummy00001 17.01.2017 12:17 # +1
с другой стороны, кодирование данных в ASN.1 говно. если не знаешь заранее что за данные - то и не распарсишь, и незнакомые поля не перепрыгнешь. я лично пользуюсь TLV. все на меня ругаются за это - потому что "медленно" и "избыточно" - но мне нравится.
Antervis 16.01.2017 21:39 # +1
guestinho 16.01.2017 21:46 # 0
Dummy00001 17.01.2017 12:19 # 0
раньше думал что это нечто что помогает интерфейсы/этц темплейтов компилеру верифицировать - и еще до инстанциирования. но как выяснилось это не оно.
roman-kashitsyn 17.01.2017 13:11 # 0
Откуда выяснилось?
Dummy00001 17.01.2017 13:26 # 0
roman-kashitsyn 17.01.2017 13:58 # 0
У вас был компилятор с поддержкой концептов? Сомневаюсь.
Если использовали BOOST_CONCEPT_CHECK, то это не совсем то. Он не проверяет, что в шаблоне не используется то, что не заявлено в требованиях. Вообще всё это похоже на "опциональные тайп-хинты", попытку прикрутить типизацию к языку, в котором её изначально не было. Много вопросов возникает.
guestinho 17.01.2017 14:14 # 0
И разве шаблон может использовать только то, что написано в концепте?
roman-kashitsyn 17.01.2017 14:34 # 0
Пошёл полистать Concept-Lite. В общем это просто предикаты на типах, компилятор не проверяет, что используются только те операции, которые были разрешены. Да не сможет он, ибо шаблон с концептами должен в теории уметь вызывать шаблоны без концептов, а там уж не известно заранее, что происходит. Это как типизацию к питону постфактум прикручивать.
Antervis 17.01.2017 14:31 # 0
Dummy00001 17.01.2017 15:59 # 0
дока к концептам есть где? потому что когда гуглишь "кресты концепции" находится только мусор.
barop 17.01.2017 16:00 # 0
Dummy00001 17.01.2017 16:05 # 0
https://en.wikipedia.org/w/index.php?title=Concepts_(C%2B%2B)&oldid =696409818
и было каким-то более или менее теоретическим Г. я еще тогда смотрелся в сырцы STL где якобы были какие-то концепции, но там точно так же ничего интересного не было.
roman-kashitsyn 17.01.2017 16:05 # 0
Ну ктож так гуглит
Там есть ссылки на PDF и гуглодоки с более подробным описанием.
Dummy00001 17.01.2017 16:12 # 0
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3351.pdf
133 страниц счастья.
Antervis 17.01.2017 14:53 # 0
guestinho 17.01.2017 15:06 # 0
guestinho 17.01.2017 15:08 # 0
Dummy00001 17.01.2017 16:01 # +2
как раз для тех кто слишком долго ходил по крестам.
степени мазохизма: ходил по лего, ходил по граблям, ходил по крестам.
guestinho 17.01.2017 16:14 # +2
Больше ненужных фич богу ненужных фич!
inkanus-gray 17.01.2017 16:18 # +1
Dummy00001 17.01.2017 16:19 # 0
умные вещи можно продавать только умным. но умным продать что ли бо сложно, потому что в конце часто все сводится к "all is good in moderation". и поиск этого самого moderation в книжках не вычитаешь - это зависит от приложений/людей/прикладной области. с чем теоретические материалы не сильно помогают.
roman-kashitsyn 17.01.2017 16:22 # 0
Спорное утверждение. В чём говно-то? Мне, вообще говоря, нравились его книги, когда я только начинал учить кресты. Гораздо лучше многого из того, что можно найти по той же жабе.
Dummy00001 17.01.2017 16:29 # 0
я его книжек не читал, но догадываюсь что они будут ОК, потому что он более прагматичный чудак. (его уже имеет смысл критиковать, по сравнению с толпами пустых мест.) я читал его лекции/презентации с воркшопов по С++ в паре прикладных областей. если ни разу в универ не ходил - то они может быть и полезны, но по уровню они CompSci 101/201, и не более.
guestinho 17.01.2017 16:31 # +1
Dummy00001 17.01.2017 17:20 # 0
barop 17.01.2017 17:10 # 0
При этом кресты цветут и пахнут, а крестопрограммисты остаются одними из самых высококлассных программистов в мире.
В чём секрет?
guestinho 17.01.2017 17:46 # 0
barop 17.01.2017 17:53 # 0
guestinho 17.01.2017 18:10 # −1
Antervis 19.01.2017 10:28 # 0
Сравнение тайплассов хаскеля и концептов с++ (проползал из c++0x, едва ли Concepts TS много в чем хуже). Вывод автора статьи:
Out of our 27 criteria, summarised in table 2, 16 are equally supported in both languages, and only one or two are not portable. So, we can safely conclude as we started — C++ concepts and Haskell type classes are very similar.
Мой вывод: вы, сударь, говноглор
guestinho 19.01.2017 13:06 # 0
roman-kashitsyn 19.01.2017 13:22 # 0
guestinho 19.01.2017 13:36 # 0
PS: Поставь себе анимешную девочку на аватарку, раз старую удалил.
huesto 19.01.2017 13:52 # 0
roman-kashitsyn 19.01.2017 13:52 # 0
щито
huesto 19.01.2017 14:28 # 0
guestinho 19.01.2017 16:48 # 0
roman-kashitsyn 19.01.2017 17:01 # 0
guestinho 19.01.2017 17:04 # 0
Antervis 19.01.2017 13:55 # 0
CHayT 19.01.2017 13:11 # +1
Я официально нарёк это словом "Метушня". Будьте добры использовать мой форсед мем.
guestinho 19.01.2017 13:14 # 0