Meine Compilier-Zeit-String-Klasse
-
Erstmal ne Runde Heulen
weil ich das Rad neu erfunden habe und bis jetzt nicht wusste, ich sah mein Compilier-Zeit-String-Klasse schon im namespace boost.
Nun ja zu früh gefreut, ich entdeckte die "Boost Template Meta Programming Library MPL" (sie ist nicht auf strings spezialisiert, aber sonst viel umfangreicher).
Und schon war die Motivation ein Dokumentation & MSVC 6.0 Workarounds zu schreiben verflogen.
Dabei sollte das so eine Art Gesellenstück werden (hätten sowieso die meisten nicht verstanden).
Aber irgend wie habe ich da zu viel Zeit rein gesteckt das es jetzt in meinen "MyProjects" Ordner verrotten soll, außerdem sind da ein paar Sachen von den die mpl noch was abkucken könnte (ich nenne sie MetaC++ Methoden)
Hier ist ein Bsp.#include <iostream> using namespace std; const char newl = '\n'; #include "cts/ctstring.h" #include "ctstocrc32.h" namespace igonorecase { template<char lhs, char rhs> struct equal { static const bool value = ctch::equal < ctch::tolow<lhs>::value, ctch::tolow<rhs>::value >::value; }; template<char lhs, char rhs> const bool equal<lhs, rhs>::value; } int main() { typedef cts::make_ctstring<'H','a','l','l','o',' ','M','e','t','a','C','+','+','!'>::result hm; cout << hm::size::value << newl; cout << hm::c_str::value << newl; // das einzige nicht compilier zeit constate cout << hm::at<0>::value << newl; cout << hm::us::at<20>::value << newl; // un steht für un save, die un methoden erlauben // zugriffe außerhalb des ctstring // was sie dan als ergebnis liefern ist unterschiedlich // at<>::value ist dan '\0' // bei substr wird mit ' ' aufgefüllt cout << cts::crc32::tocrc32<hm>::value << newl; cout << hm::substr<6, 4>::result::c_str::value << newl; // ohne MetaC++ Methoden würde das so aussehen // cts::c_str<cts::substr<hm, 5, 4>::result>::value typedef cts::make_ctstring<'H','A','L','L','O'>::result HALLO; typedef cts::make_ctstring<'h','a','l','l','o'>::result hallo; cout << HALLO::equal<hallo>::value << newl; cout << HALLO::equal<hallo, igonorecase::equal>::value << newl; typedef cts::make_ctstring<'A','t',':','1'>::result foo; const unsigned long atpos = foo::substr<3,1>::result::toul<10>::value; cout << hallo::at<atpos>::value << newl; }
da der Quellcode sauber über ~10 Dateien verteilt ist und etwa 600 Zeilen umfast will ich ihn hier nicht posten, wer ihn möchte soll mir ne Mail schreiben choinka@web.de und wenn ich morgen das LGPL zeugs in die Header eingetragen habe schicke ist den Code in die Welt.
Das ich ihn nicht boost reif mache heißt aber nicht das ihr keine Kritik üben braucht (aber Achtung bin deprimiert wegen boost::mpl)mini docu:
die MetaC++ Methoden liefern entweder value (char, bool, int) oder result, result ist ein ctstring,
ihr müsst boost installiert haben weil ich BOOST_STATIC_ASSERT benutze und <boost/compatibility/cpp_c_headers/cstddef> include für std::size_t[ Dieser Beitrag wurde am 02.01.2003 um 08:25 Uhr von Dimah editiert. ]
-
Das mit dem CRC32 interessiert mich... Wenn möglich zeig doch das für CRC32 relevante hier, oder ist das zu viel?
-
Original erstellt von Dimah:
Erstmal ne Runde Heulen
weil ich das Rad neu erfunden habe und bis jetzt nicht wusste, ich sah mein Compilier-Zeit-String-Klasse schon im namespace boost.
Nun ja zu früh gefreut, ich entdeckte die "Boost Template Meta Programming Library MPL" (sie ist nicht auf strings spezialisiert, aber sonst viel umfangreicher).
Und schon war die Motivation ein Dokumentation & MSVC 6.0 Workarounds zu schreiben verflogen.
Dabei sollte das so eine Art Gesellenstück werden (hätten sowieso die meisten nicht verstanden).
Aber irgend wie habe ich da zu viel Zeit rein gesteckt das es jetzt in meinen "MyProjects" Ordner verrotten soll, außerdem sind da ein paar Sachen von den die mpl noch was abkucken könnte (ich nenne sie MetaC++ Methoden)volkard hat mir letztens gesagt, dass man sowieso fast nie etwas machen wird, was nicht irgendjemand schon woanders gemacht hat. Insofern ist das die falsche Motivation etwas zu tun.
Es war doch sicher eine super Uebung, oder?
-
Original erstellt von Mr. N:
Das mit dem CRC32 interessiert mich... Wenn möglich zeig doch das für CRC32 relevante hier, oder ist das zu viel?#ifndef CTS_CRC32TAB_H_DIM #define CTS_CRC32TAB_H_DIM #include <boost/static_assert.hpp> namespace cts { namespace crc32 { namespace detail { template<int index> struct crc32tab { BOOST_STATIC_ASSERT( index < 256 ); static const unsigned long int value = 0; }; template<int index> const unsigned long int crc32tab<index>::value; template<> struct crc32tab<0> { static const unsigned long int value = 0x0ul; }; template<> struct crc32tab<1> { static const unsigned long int value = 0x77073096ul; }; template<> struct crc32tab<2> { static const unsigned long int value = 0xEE0E612Cul; }; ... ... ... template<> struct crc32tab<253> { static const unsigned long int value = 0xC30C8EA1ul; }; template<> struct crc32tab<254> { static const unsigned long int value = 0x5A05DF1Bul; }; template<> struct crc32tab<255> { static const unsigned long int value = 0x2D02EF8Dul; }; } // end of namespace detail } // end of namespace crc32 } // end of namespace cts #endif // #ifndef CTS_CRC32TAB_H_DIM
und dan
#ifndef CTS_CTSTOCRC32_H_DIM #define CTS_CTSTOCRC32_H_DIM #include "cts/nodefwd.h" #include "crc32tab.h" namespace cts { namespace crc32 { template<typename ctstr, unsigned long int crc32 = 0xFFFFFFFF> struct tocrc32 { private: typedef typename ctstr::next nextnode; public: static const unsigned long int value = cts::crc32::tocrc32 < nextnode, (crc32 >> 8) ^ (cts::crc32::detail::crc32tab<(crc32 & 0xFF) ^ ctstr::data>::value) >::value; }; template<typename ctstr, unsigned long int crc32> const unsigned long int tocrc32<ctstr, crc32>::value; template<unsigned long int crc32> struct tocrc32<cts::endnode, crc32> { static const unsigned long int value = crc32 ^ 0xFFFFFFFF; }; } // end of namespace crc32 } // end of namespace cts #endif // #ifndef CTS_CTSTOCRC32_H_DIM
-
Original erstellt von Shade Of Mine:
**volkard hat mir letztens gesagt, dass man sowieso fast nie etwas machen wird, was nicht irgendjemand schon woanders gemacht hat. Insofern ist das die falsche Motivation etwas zu tun.Es war doch sicher eine super Uebung, oder?**
klar