libDAI version 0.3.2
[libdai.git] / include / dai / enum.h
index 491cd35..1731404 100644 (file)
@@ -1,27 +1,13 @@
-/*  Copyright (C) 2006-2008  Joris Mooij  [joris dot mooij at tuebingen dot mpg dot de]
-    Radboud University Nijmegen, The Netherlands /
-    Max Planck Institute for Biological Cybernetics, Germany
-
-    This file is part of libDAI.
-
-    libDAI is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    libDAI is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with libDAI; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-*/
+/*  This file is part of libDAI - http://www.libdai.org/
+ *
+ *  Copyright (c) 2006-2011, The libDAI authors. All rights reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+ */
 
 
 /// \file
-/// \brief Defines the DAI_ENUM macro
+/// \brief Defines the DAI_ENUM macro, which can be used to define an \c enum with additional functionality.
 
 
 #ifndef __defined_libdai_enum_h
@@ -33,7 +19,7 @@
 #include <dai/exceptions.h>
 
 
-/// Extends the C++ enum type by supporting input/output streaming and conversion to and from const char* and size_t
+/// Extends the C++ \c enum type by supporting input/output streaming and conversion to and from <tt>const char*</tt> and \c size_t
 /** For more details see the source code.
  *
  *  \par Example:
         x(value w) : v(w) {}\
 \
         x(char const *w) {\
-            static char const* labelstring = #val0 "," #__VA_ARGS__ ",";\
+            static char const* labelstring = #val0 "," #__VA_ARGS__;\
             size_t pos_begin = 0;\
             size_t i = 0;\
-            for( size_t pos_end = 0; labelstring[pos_end] != '\0'; pos_end++ )\
-                if( (labelstring[pos_end] == ',') ) {\
+            for( size_t pos_end = 0; ; pos_end++ ) {\
+                if( (labelstring[pos_end] == ',') || (labelstring[pos_end] == '\0') ) {\
                     if( (strlen( w ) == pos_end - pos_begin) && (strncmp( labelstring + pos_begin, w, pos_end - pos_begin ) == 0) ) {\
                         v = (value)i;\
                         return;\
                         pos_begin = pos_end + 1;\
                     }\
                 }\
-            DAI_THROW(UNKNOWN_ENUM_VALUE);\
+                if( labelstring[pos_end] == '\0' )\
+                    break;\
+            }\
+            DAI_THROWE(UNKNOWN_ENUM_VALUE,"'" + std::string(w) + "' is not in [" + std::string(labelstring) + "]");\
         }\
 \
         operator value() const { return v; }\
                     }\
                 }\
         }\
+\
+        operator wchar_t const*() const {\
+            static wchar_t labelstring[] = #val0 L"," #__VA_ARGS__;\
+            size_t pos_begin = 0;\
+            size_t i = 0;\
+            for( size_t pos_end = 0; ; pos_end++ )\
+                if( (labelstring[pos_end] == L',') || (labelstring[pos_end] == L'\0') ) {\
+                    if( (size_t)v == i ) {\
+                        labelstring[pos_end] = L'\0';\
+                        return labelstring + pos_begin;\
+                    } else {\
+                        i++;\
+                        pos_begin = pos_end + 1;\
+                    }\
+                }\
+        }\
 \
         friend std::istream& operator >> (std::istream& is, x& y) {\
             std::string s;\
             y = x(s.c_str());\
             return is;\
         }\
+\
+        friend std::wistream& operator >> (std::wistream& wis, x& y) {\
+            std::wstring s;\
+            wis >> s;\
+            y = x((const char *)s.c_str());\
+            return wis;\
+        }\
 \
         friend std::ostream& operator << (std::ostream& os, const x& y) {\
             os << (const char *)y;\
             return os;\
         }\
 \
-    private:\
+        friend std::wostream& operator << (std::wostream& wos, const x& y) {\
+            wos << (const wchar_t *)y;\
+            return wos;\
+        }\
+\
+    protected:\
         value v;\
 };