X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fcontainer.h;h=2459b364ffb0d36c70004f530cdc1cd147dd1751;hp=88ccd6a0adec63d4800abea17db8cd36d327d701;hb=3db194853d3dd2719231b83e4956cf6bcbe53627;hpb=757406e244f4f257aafaa0f355d5376122cea10e diff --git a/ginac/container.h b/ginac/container.h index 88ccd6a0..2459b364 100644 --- a/ginac/container.h +++ b/ginac/container.h @@ -28,6 +28,7 @@ #include #include #include +#include #include "ex.h" #include "print.h" @@ -66,6 +67,64 @@ template <> inline void container_storage::reserve(std::vector & v, size_t n) { v.reserve(n); } +/** Helper template to allow initialization of containers via an overloaded + * comma operator (idea stolen from Blitz++). */ +template +class container_init { +public: + container_init(STLT & s) : stlt(s) {} + + container_init operator,(const T & x) + { + stlt.push_back(x); + return container_init(stlt); + } + + // The following specializations produce much tighter code than the + // general case above + + container_init operator,(int x) + { + stlt.push_back(x); + return container_init(stlt); + } + + container_init operator,(unsigned int x) + { + stlt.push_back(x); + return container_init(stlt); + } + + container_init operator,(long x) + { + stlt.push_back(x); + return container_init(stlt); + } + + container_init operator,(unsigned long x) + { + stlt.push_back(x); + return container_init(stlt); + } + + container_init operator,(double x) + { + stlt.push_back(x); + return container_init(stlt); + } + + container_init operator,(const symbol & x) + { + stlt.push_back(T(x)); + return container_init(stlt); + } + +private: + container_init(); + STLT & stlt; +}; + + /** Wrapper template for making GiNaC classes out of STL containers. */ template