Pages

mercredi 30 novembre 2011

falcon: un ensemble de fonctions et classes basé sur le nouveau standard du C++

J'attends avec impatience que les standards du C++0x et C++11 soient introduits dans les compilateurs. Les nouveautés sont très intéressantes et permettent des choses qui étaient alors impossibles.
Il y a quelques semaines une mise à jour des dépôts m'a fait passer à g++4.6.1. Même si tout n'est pas encore terminé ‑comme le support du nouveau mot clef constexp ou certaines fonctions comme tuple::tie‑ la mise à jour apporte quand même le support de nullptr et la nouvelle syntaxe du for :
exemple
std::forward_list<int> l({0,1,2,3,4});
for(auto& v: l)
  ++v;
std::endl(std::cout);
for(auto v: l)
  std::cout << v << ',';

Il y a sûrement eu d'autres améliorations mais je n'ai pas vraiment regardé. Hélas, l'IDE que j'utilise (KDevelop) ne supporte pas de faire des fonctions lambda ou certaines autres améliorations syntaxiques (mais quel IDE le supporte ?)
exemple d'utilisation d'une fonction lambda
std::for_each<>(l.begin(), l.end(), [](int& i){
  std::cout << v << ',';
});

Pour combler ce problème et ne pas avoir un nombre trop conséquent d'erreurs qui ralentissent inutilement l'interpréteur j'ai fait un ensemble de macros.
Bien sûr certaines macros sont totalement incompatibles avec C++99 (celles du dossier c++0x). Mais dans ce cas un joli message va l'indiquer (honteusement repris d'un header de la std).
Falcon est composé d'un peu plus de cent fichiers divisés en plusieurs ensembles, en voici quelques-uns:
  • sfinae: qui permet de vérifier l'existence d'un type, d'un nom de fonction, si cette fonction est appelable avec tel ou tel paramètre, ainsi que la vérification d'un retour convertible en un autre type.
  • lambda: qui se comporte comme boost::lambda mais sans l'erreur de la rvalue référence.
  • algorithm: qui permet d'appeler les algorithmes de la std en donnant un container (donc pas besoin de faire begin() et end()). Fonctionne aussi avec les tableaux.
  • iterator: un ensemble itérateur plus ou moins étrange comme un itérateur infini ou un faux itérateur.
  • arg: qui permet de faire joujou avec les paramètres varialen pour, par exemple récupérer le type ou la valeur d'un paramètre positionné à une place n.
Il y en a bien d'autres mais autant télécharger les sources. Tout n'est pas fini pour autant et il y aura sûrement des ajouts… quand j'aurai de nouvelles idées :).

dl falcon. Le fichier Doxygen permet de générer une documentation, je vous conseille de générer la doc avec et sans la macro __GXX_EXPERIMENTAL_CXX0X__. Doxygen ne supportant pas encore bien c++0x les résultats sont catastrophiques sur certaines parties.

Switch-viewer pour KDevelop


Switch-viewer est un plugin conçu pour KDevelop suite au manque de fonctionnalités au niveau de la vue. Les vues correspondent au cadre contenant les fichiers, mais aucun moyen de se déplacer d'une vue à l'autre simplement. La seule façon de faire est de sélectionner le fichier (trier par ordre d'activation), seul problème, comment savoir quel fichier appartient à la vue s'il est ouvert plusieurs fois ?

Switch-viwer permet de résoudre ce problème et ajoute quelques fonctionnalités au niveau des vues :

Le passage d'une vue à l'autre se fait en boucle, la vue qui suit la dernière est la première et celle qui précède la première est la dernière.
  • Allez à la vue suivante (ALT+V).
  • Allez à la vue précédente (ALT+SHIFT+V).
Le déplacement d'un fichier d'une vue à l'autre la scinde si elle ne l'est pas déjà.
  • Déplacer le fichier courant dans la vue suivante (CTRL+ALT+V).
  • Déplacer le fichier courant dans la vue précédente (CTRL+ALT+SHIFT+V).
  • Supprimer les vues déjà présentes dans d'autres groupes.
  • Supprimer les vues du groupe présentes dans d'autres groupes.