From fc3b5d4d4f684baa6216685a0696efb853141529 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 17 Feb 2008 19:29:39 +0000 Subject: move lcdf-typetools to texk and update to 2.66 git-svn-id: svn://tug.org/texlive/trunk@6662 c570f23f-e606-0410-a88d-b1316a301751 --- .../texk/lcdf-typetools/include/lcdf/permstr.hh | 167 +++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 Build/source/texk/lcdf-typetools/include/lcdf/permstr.hh (limited to 'Build/source/texk/lcdf-typetools/include/lcdf/permstr.hh') diff --git a/Build/source/texk/lcdf-typetools/include/lcdf/permstr.hh b/Build/source/texk/lcdf-typetools/include/lcdf/permstr.hh new file mode 100644 index 00000000000..2db15772ded --- /dev/null +++ b/Build/source/texk/lcdf-typetools/include/lcdf/permstr.hh @@ -0,0 +1,167 @@ +// -*- related-file-name: "../../liblcdf/permstr.cc" -*- +#ifndef LCDF_PERMSTR_HH +#define LCDF_PERMSTR_HH +#include +#include +#include +#include +class PermString; +inline bool operator==(PermString, PermString); +inline bool operator!=(PermString, PermString); + +class PermString { struct Doodad; public: + + typedef Doodad *Capsule; + // Declare a PermString::Initializer in any file in which you declare + // static global PermStrings. + struct Initializer { Initializer(); }; + + PermString() : _rep(zero_char_doodad.data) { } + explicit PermString(char c); + inline PermString(const char*); + inline PermString(const char*, int); + inline PermString(const char*, const char*); + + inline operator bool() const; + inline bool operator!() const; + + inline int length() const; + char operator[](int) const; + const char* begin() const { return _rep; } + inline const char* end() const; + + friend inline bool operator==(PermString, PermString); + friend inline bool operator!=(PermString, PermString); + + const char* c_str() const { return _rep; } + + inline Capsule capsule() const; + inline static PermString decapsule(Capsule c); + + friend PermString permprintf(const char*, ...); + friend PermString vpermprintf(const char*, va_list); + friend PermString permcat(PermString, PermString); + friend PermString permcat(PermString, PermString, PermString); + + private: + + struct Doodad { + Doodad* next; + int length; + char data[2]; + }; + + const char* _rep; + + PermString(Doodad* d) : _rep(d->data) { } + void initialize(const char*, int); + Doodad* doodad() const { return (Doodad*)(_rep - offsetof(Doodad, data)); } + + friend struct PermString::Initializer; + static void static_initialize(); + + enum { NHASH = 1024 }; // must be power of 2 + static Doodad zero_char_doodad, one_char_doodad[256], *buckets[NHASH]; + +}; + + +inline +PermString::PermString(const char* s) +{ + initialize(s, -1); +} + +inline +PermString::PermString(const char* s, int len) +{ + initialize(s, len); +} + +inline +PermString::PermString(const char* begin, const char* end) +{ + assert(end); + initialize(begin, end > begin ? end - begin : 0); +} + +inline +PermString::operator bool() const +{ + return _rep != zero_char_doodad.data; +} + +inline bool +PermString::operator!() const +{ + return _rep == zero_char_doodad.data; +} + +inline int +PermString::length() const +{ + return doodad()->length; +} + +inline const char* +PermString::end() const +{ + return _rep + doodad()->length; +} + +inline bool +operator==(PermString a, PermString b) +{ + return a._rep == b._rep; +} + +bool operator==(PermString, const char*); + +inline bool +operator==(const char* a, PermString b) +{ + return b == a; +} + +inline bool +operator!=(PermString a, PermString b) +{ + return a._rep != b._rep; +} + +inline bool +operator!=(PermString a, const char* b) +{ + return !(a == b); +} + +inline bool +operator!=(const char* a, PermString b) +{ + return !(b == a); +} + +inline PermString::Capsule +PermString::capsule() const +{ + return doodad(); +} + +inline PermString +PermString::decapsule(Capsule c) +{ + return PermString(c); +} + +inline unsigned +hashcode(PermString s) +{ + return (uintptr_t)(s.c_str()); +} + +PermString permprintf(const char*, ...); +PermString vpermprintf(const char*, va_list); +PermString permcat(PermString, PermString); +PermString permcat(PermString, PermString, PermString); + +#endif -- cgit v1.2.3