Stroika est un cadre d'application C ++ moderne et portable. Il facilite l'écriture C ++ en fournissant des blocs de construction sûrs et flexibles, ainsi que des emballages sur d'autres bibliothèques utiles qui les aident à travailler ensemble plus apparemment.
String a = u8" abc " ;
String b = u32 " abc " ;
CallFunction (a+b);
// trim whitespace, and convert to u16string for some legacy API
std::u16string uuu = (a+b).Trim ().As<u16string>();
// tokenize
String t{ " ABC DEF G " };
Assert (t.Tokenize ()[1] == "DEF"); // most Stroika types automatically support formattable<>
DbgTrace ( " v = {} " _f, v); // to a tracelog file, or debugger
cerr << " v = {} " _f (v) << endl; // OR iostreams (unicode mapped automatically) // nb: String is an Iterable<Character>,
// despite internally representing the characters very differently
bool IsAllWhitespace (String s) const
{
return not s. Find ([] (Character c) -> bool { return not c. IsWhitespace (); });
}
Iterable< int > c { 1 , 2 , 2 , 5 , 9 , 4 , 5 , 6 };
EXPECT_TRUE (c.Distinct ().SetEquals ({ 1 , 2 , 4 , 5 , 6 , 9 }));
Iterable< int > c { 3 , 4 , 7 };
// Map iterates over 'c' and produces the template argument container
// automatically by appending the result of each lambda application
EXPECT_EQ ((c.Map<vector<String>> ([] ( int i) { return " {} " _f (i); }), vector<String>{ " 3 " , " 4 " , " 7 " }));La vache (la copie-écriture améliore souvent les performances pour les cas les plus courants)
API définies par le modèle d'accès, comme pile = push / pop, séquence = accès de type tableau, map = {de: à: à}, etc.
Transparence de représentation
Stroika fournit un riche ensemble d'archtypes de conteneurs et des impléments de structure de données.
extern void f (Set< int >);
// use the default Set<> representation - the best for type 'int'
Set< int > s{ 1 , 2 , 3 };
f (s); // data not actually copied - Stroika containers use 'copy-on-write (COW)'
s = Concrete::SortedSet_SkipList< int >{s}; // Use a skiplist to represent the set
f (s); // call f the same way regardless of data structure used for implementation
// set equality not order dependent (regardless of data structure)
Assert (s == { 2 , 3 , 1 }); Voir échantillon de conteneurs pour plus de détails
MyClass someObject = ...;
VariantValue v = mapper.FromObject (someObject); // Map object to a VariantValue
// Serialize using any serialization writer defined in
// Stroika::Foundation::DataExchange::Variant (we selected JSON)
Streams::MemoryStream:: Ptr <byte> tmpStream = Streams::MemoryStream::New<byte> ();
Variant::JSON::Writer{}.Write (v, tmpStream);
// You can persist these to file if you wish
{
using namespace IO ::FileSystem ;
FileOutputStream:: Ptr tmpFileStream =
FileOutputStream::New ( WellKnownLocations::GetTemporary () / " t.txt " );
Variant::JSON::Writer{}. Write (v, tmpFileStream);
}Voir échantillon de sérialisation pour plus de détails
Route{ " variables/(.+) " _RegEx,
// explicit message handler
[ this ] (Message& m, const String& varName) {
WriteResponse (m. rwResponse (), kVariables_ , kMapper . FromObject ( fWSImpl_ -> Variables_GET (varName)));
}},
Route{HTTP::MethodsRegEx:: kPost , " plus " _RegEx,
// automatically map high level functions via ObjectVariantMapper
ObjectRequestHandler::Factory{ kBinaryOpObjRequestOptions_ ,
[ this ] (Number arg1, Number arg2) { return fWSImpl_ -> plus (arg1, arg2); }}},Voir l'échantillon de serviettes Web pour plus de détails.
Fait la compression, le chiffrement, l'EMI, le réseautage, le traitement des données, tous s'adaptent sans ensemble
// @todo INCOMPLETE - BAD EXAMPLE---
const OpenSSL::DerivedKey kDerivedKey =
OpenSSL::EVP_BytesToKey{ OpenSSL::CipherAlgorithms::kAES_256_CBC (), OpenSSL::DigestAlgorithms:: kMD5 , " password " };
const Memory::BLOB srcText =
Memory::BLOB::FromHex ( " 2d ... " ); // ...
// EncodeAES takes a stream, and produces a stream
// which can be chained with the gzip Transformer, which takes a stream, and produces a
Compression::GZip::Compress::New ().Transform (EncodeAES ( kDerivedKey , srcText.As<Streams::InputStream:: Ptr <byte>> (), AESOptions::e256_CBC))Stylistiquement, Stroika diffère de la bibliothèque C ++ standard, Boost et de nombreuses autres bibliothèques C ++, en ce qu'elle, il embrasse (relativement) des abstractions orientées objet sur la généricité basée sur les modèles (voir Stoika-Approach-to-performance.md). L'abstraction des hiérarchies de type est mieux adaptée à la façon dont les gens raisonnent, et les modèles et les concepts - bien que puissants - peuvent être avec une intention de programmeur avec délicatesse et obscure. De plus, Stroika met l'accent sur la séparation de l'interface de la mise en œuvre: documenter soigneusement l'interface dans les en-têtes et séparer l'implémentation à d'autres fichiers.
Stroika comprend 2 couches: la fondation, qui fournit des classes de blocs de construction applicables à la plupart des applications, et une série de cadres spécifiques au domaine qui fournissent une riche collection de code dans différents domaines.

Les cadres dépendent de la fondation; Les modules de fondation dépendent fréquemment les uns des autres; Mais le code de couche de fondation ne contient aucune dépendance en dehors de la fondation (sauf sur la bibliothèque C ++ standard et diverses bibliothèques ThirdPartyComponent éventuellement incluses ou référencées, comme OpenSSL).
Je ne veux pas lire - je veux juste coder. Instructions étape par étape pour créer votre première application basée sur Stroka sur votre machine, en quelques minutes (moins de temps de téléchargement / compilation - qui varie).
La plus grande force de Stroika est également sa plus grande faiblesse:
Stroika V3 en développement actif ( non stable ), et nécessite C ++ 20 ou version ultérieure.
Stroika V2.1 est stable (en maintenance) et nécessite C ++ 17 ou version ultérieure. La version 2.1 prend également en charge conditionnellement de nombreuses fonctionnalités C ++ 20 (telles que la comparaison à trois voies, etc., si disponible).
Stoika v2.0 est très stable et nécessite C ++ 14 ou version ultérieure. Stoika V2.0 est utilisé pour alimenter une grande variété d'applications open source et commerciales.
Linux, macOS, Windows
Stroika v3
TBD, mais jusqu'à présent ressemble à VS2K22 (17.9) ou ultérieure sur Windows, Xcode 15 (.2) ou ultérieure sur macOS et G ++ 11 ou version ultérieure, et Clang ++ 15 ou ultérieure.
Stroika v2.1
Testé sur x86, ARM (+ M1), GCC 8 à GCC 12, Clang 6 à Clang 14, Visual Studio.net 2017, Visual Studio.net 2019 et Visual Studio.net 2022, Xcode 13, 14, 15.
Stroika v2.0
Testé sur x86, bras, gcc 5 à gcc 8, clang 3 à Clang 6, xcode 8 à 9.
Actions github
| Branches | Statut | |
|---|---|---|
| V3-Lideas | ![]() | .github / workflows / build-n-test.yml |
| v3-dev | ![]() | .github / workflows / build-n-test.yml |
Pour plus de détails sur les modifications de libération individuelles, voir:
Release-notes.md
"Démarrage", création d'instructions, conception et autres documents:
Documentation/
Regarder les échantillons est également un bon moyen de commencer:
Échantillons /
Veuillez signaler les bogues / problèmes à:
http://stroika-bugs.sophistes.com