CISTA ++ هي طريقة بسيطة ومفتوحة المصدر (ترخيص MIT) C ++ 17 طريقة متوافقة لهياكل بيانات C ++ (إلغاء).
رأس واحد - لا تبعيات. لا وحشية. لا يوجد توليد رمز مصدر.
يمكن استخدام آلية الانعكاس الأساسية بطرق أخرى أيضًا!
أمثلة:
قم بتنزيل أحدث إصدار وجربه.
مثال بسيط الكتابة على المخزن المؤقت:
namespace data = cista::raw;
struct my_struct { // Define your struct.
int a_{ 0 };
struct inner {
data::string b_;
} j;
};
std::vector< unsigned char > buf;
{ // Serialize.
my_struct obj{ 1 , {data::string{ " test " }}};
buf = cista::serialize (obj);
}
// Deserialize.
auto deserialized = cista::deserialize<my_struct>(buf);
assert (deserialized->j.b_ == data::string{ " test " });مثال متقدم على كتابة خريطة تجزئة إلى ملف تم تعيينه للذاكرة:
namespace data = cista::offset;
constexpr auto const MODE = // opt. versioning + check sum
cista::mode::WITH_VERSION | cista::mode::WITH_INTEGRITY;
struct pos { int x, y; };
using pos_map = // Automatic deduction of hash & equality
data::hash_map<data::vector<pos>,
data::hash_set<data::string>>;
{ // Serialize.
auto positions =
pos_map{{{{ 1 , 2 }, { 3 , 4 }}, { " hello " , " cista " }},
{{{ 5 , 6 }, { 7 , 8 }}, { " hello " , " world " }}};
cista::buf mmap{cista::mmap{ " data " }};
cista::serialize<MODE>(mmap, positions);
}
// Deserialize.
auto b = cista::mmap( " data " , cista::mmap::protection::READ);
auto positions = cista::deserialize<pos_map, MODE>(b);مثال متقدم يوضح الدعم لأنواع غير مجمعة مثل الفئات أو الفئات المشتقة مع منشئات مخصصة:
namespace data = cista::offset;
constexpr auto MODE = cista::mode::WITH_VERSION;
struct parent {
parent () = default ;
explicit parent ( int a) : x_{a}, y_{a} {}
auto cista_members () { return std::tie (x_, y_); }
int x_, y_;
};
struct child : parent {
child () = default ;
explicit child ( int a) : parent{a}, z_{a} {}
auto cista_members () {
return std::tie (* static_cast <parent*>( this ), z_);
}
int z_;
};
/*
* Automatically defaulted for you:
* - de/serialization
* - hashing (use child in hash containers)
* - equality comparison
* - data structure version ("type hash")
*/
using t = data::hash_map<child, int >;
// ... usage, serialization as in the previous examplesإلقاء نظرة على المستودع القياسي لمزيد من التفاصيل.
| مكتبة | التسلسل | هجر | سريع الهفر | اجتياز | Deserialize & Traverse | مقاس |
|---|---|---|---|---|---|---|
| Cap'n proto | 105 مللي ثانية | 0.002 مللي ثانية | 0.0 مللي ثانية | 356 مللي ثانية | 353 مللي ثانية | 50.5m |
| رقائق الذرة | 239 مللي ثانية | 197.000 مللي ثانية | - | 125 مللي ثانية | 322 مللي ثانية | 37.8 م |
CISTA ++ offset | 72 مللي ثانية | 0.053 مللي ثانية | 0.0 مللي ثانية | 132 مللي ثانية | 132 مللي ثانية | 25.3 م |
Cista ++ raw | 3555 مللي ثانية | 68.900 مللي ثانية | 21.5 مللي ثانية | 112 مللي ثانية | 133 مللي ثانية | 176.4m |
| Flatbuffers | 2349 مللي ثانية | 15.400 مللي ثانية | 0.0 مللي ثانية | 136 مللي ثانية | 133 مللي ثانية | 63.0m |
يجب أن يكون للقارئ والكاتب نفس عرض المؤشر. يتم دعم تحميل البيانات على الأنظمة ذات ترتيب بايت مختلف (Endianess). أمثلة:
حاليًا ، يمكن للبرنامج C ++ 17 فقط قراءة/كتابة البيانات. ولكن يجب أن يكون من الممكن إنشاء ملحقات للغات البرمجة الأخرى أيضًا.
إذا كنت بحاجة إلى أن تكون متوافقًا مع لغات البرمجة الأخرى أو تتطلب تطور البروتوكول (التوافق الهبوطي) ، فيجب عليك البحث عن حل آخر:
لا تتردد في المساهمة (تقارير الأخطاء ، وسحب الطلبات ، وما إلى ذلك)!