From b5dbff8ed4ff6bdc6bdc68987f71983e3b6c32d3 Mon Sep 17 00:00:00 2001
From: m <415fox@gmail.com>
Date: Fri, 27 Jan 2012 12:24:14 -0800
Subject: [PATCH 2/4] Fix basic_string<unsigned char> not implemented in
 stdc++ 3

---
 src/blob.hpp |   94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 94 insertions(+), 0 deletions(-)

diff --git a/src/blob.hpp b/src/blob.hpp
index b8039c4..a2edf11 100644
--- a/src/blob.hpp
+++ b/src/blob.hpp
@@ -23,6 +23,100 @@
 
 #include <string>
 
+// Borrowed from id3lib_strings.h:
+// They seem to be doing something for MSC, but since I only have gcc, I'll just do that
+// Assuming this is uneccessary on GCC 4
+// #if (defined(__GNUC__) && (__GNUC__ >= 3) || (defined(_MSC_VER) && _MSC_VER > 1000))
+#if (defined(__GNUC__) && (__GNUC__ >= 3) && (__GNUC__ <= 4))
+namespace std
+{
+  template<>
+    struct char_traits<unsigned char>
+    {
+      typedef unsigned char char_type;
+      // Unsigned as wint_t in unsigned.
+      typedef unsigned long  	int_type;
+      typedef streampos 	pos_type;
+      typedef streamoff 	off_type;
+      typedef mbstate_t 	state_type;
+
+      static void
+      assign(char_type& __c1, const char_type& __c2)
+      { __c1 = __c2; }
+
+      static bool
+      eq(const char_type& __c1, const char_type& __c2)
+      { return __c1 == __c2; }
+
+      static bool
+      lt(const char_type& __c1, const char_type& __c2)
+      { return __c1 < __c2; }
+
+      static int
+      compare(const char_type* __s1, const char_type* __s2, size_t __n)
+      {
+        for (size_t __i = 0; __i < __n; ++__i)
+          if (!eq(__s1[__i], __s2[__i]))
+            return lt(__s1[__i], __s2[__i]) ? -1 : 1;
+        return 0;
+      }
+
+      static size_t
+      length(const char_type* __s)
+      {
+        const char_type* __p = __s;
+          while (__p)
+            ++__p;
+        return (__p - __s);
+      }
+
+      static const char_type*
+      find(const char_type* __s, size_t __n, const char_type& __a)
+      {
+        for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
+          if (*__p == __a) return __p;
+        return 0;
+      }
+
+      static char_type*
+      move(char_type* __s1, const char_type* __s2, size_t __n)
+      { return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
+
+      static char_type*
+      copy(char_type* __s1, const char_type* __s2, size_t __n)
+      { return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
+
+      static char_type*
+      assign(char_type* __s, size_t __n, char_type __a)
+      {
+        for (char_type* __p = __s; __p < __s + __n; ++__p)
+          assign(*__p, __a);
+        return __s;
+      }
+
+      static char_type
+      to_char_type(const int_type& __c)
+      { return char_type(); }
+
+      static int_type
+      to_int_type(const char_type& __c) { return int_type(); }
+
+      static bool
+      eq_int_type(const int_type& __c1, const int_type& __c2)
+      { return __c1 == __c2; }
+
+      static int_type
+      eof() { return static_cast<int_type>(-1); }
+
+      static int_type
+      not_eof(const int_type& __c)
+      { return eq_int_type(__c, eof()) ? int_type(0) : __c; }
+    };
+
+} // namespace std
+#endif // GCC version 3
+
+
 namespace zmq
 {
 
-- 
1.7.6

