Add DEFINE_ENUM_CONVERT macro for defining PBD::string_to/to_string for enums
authorTim Mayberry <mojofunk@gmail.com>
Wed, 24 Aug 2016 12:25:51 +0000 (22:25 +1000)
committerTim Mayberry <mojofunk@gmail.com>
Tue, 18 Apr 2017 21:49:58 +0000 (07:49 +1000)
A simple macro for defining the four template specializations required to
convert an enum to a string and back using the existing string_2_enum and
enum_2_string functions. Generally these will only be instantiated in one
source file, I don't think it is necessary to explicitly instantiate any at
this stage.

libs/pbd/pbd/enum_convert.h [new file with mode: 0644]

diff --git a/libs/pbd/pbd/enum_convert.h b/libs/pbd/pbd/enum_convert.h
new file mode 100644 (file)
index 0000000..e872d40
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+    Copyright (C) 2015 Tim Mayberry
+
+    This program 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.
+
+    This program 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 this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef PBD_ENUM_CONVERT_H
+#define PBD_ENUM_CONVERT_H
+
+#include "pbd/enumwriter.h"
+#include "pbd/string_convert.h"
+
+#define TO_STRING_FULL(Type)                                                                       \
+       template <>                                                                                      \
+       inline bool to_string (Type val, std::string& str)                                               \
+       {                                                                                                \
+               str = enum_2_string (val);                                                                     \
+               return true;                                                                                   \
+       }
+
+#define STRING_TO_FULL(Type)                                                                       \
+       template <>                                                                                      \
+       inline bool string_to (const std::string& str, Type& val)                                        \
+       {                                                                                                \
+               val = (Type)string_2_enum (str, val);                                                          \
+               return true;                                                                                   \
+       }
+
+#define TO_STRING(Type) \
+       template<> inline std::string to_string (Type val) \
+       { return enum_2_string (val); }
+
+#define STRING_TO(Type) \
+       template<> inline Type string_to (const std::string& str) \
+       { Type val; return (Type) string_2_enum (str, val); }
+
+#define DEFINE_ENUM_CONVERT(Type)                                                                  \
+       TO_STRING_FULL (Type)                                                                            \
+       STRING_TO_FULL (Type)                                                                            \
+       TO_STRING (Type)                                                                                 \
+       STRING_TO (Type)
+
+#endif // PBD_ENUM_CONVERT_H