Here is the simpliest (I think) boost-preprocessor library based approach (from stackoverflow) for converting enum values to string:
#include <boost/preprocessor.hpp>
#define X_ENUM_STRING_TOSTRING_CASE(r, data, elem) \
case elem : return BOOST_PP_STRINGIZE(elem);
#define ENUM_STRING(name, enumerators) \
enum name \
{ \
BOOST_PP_SEQ_ENUM(enumerators) \
}; \
\
inline const char* toString(name val) \
{ \
switch (val) \
{ \
BOOST_PP_SEQ_FOR_EACH( \
X_ENUM_STRING_TOSTRING_CASE, \
name, \
enumerators \
) \
default: \
assert(false); return "[Unknown " BOOST_PP_STRINGIZE(name) "]"; \
} \
}
// Usage sample:
ENUM_STRING(Button, (Ok)(Close)(Retry)(Yes)(No)(Abort)(Help)(Cancel))
void foo()
{
std::string btnHelpName = toString(Button::Help); // btnHelpName == "Help"
std::string btnCloseName = toString(Button::Close); // btnCloseName == "Close"
}
Showing posts with label snippets. Show all posts
Showing posts with label snippets. Show all posts
Monday, June 29, 2015
Tuesday, November 25, 2014
How to revert a singly linked list
struct Node{
Node* next;
int value;
};
Node* revert_iteratively(Node* node)
{
Node* new_node = nullptr;
while (node)
{
auto next = node->next;
node->next = new_node;
new_node = node;
node = next;
}
return new_node;
}
Node* revert_iteratively_simple(Node* node)
{
using std::swap;
for (Node* tmp = nullptr; swap(node, tmp), tmp; swap(node, tmp->next));
return node;
}
Node* revert_recursively(Node* node)
{
if (!node || !node->next)
return node;
auto new_node = revert_recursively(node->next);
node->next->next = node;
node->next = nullptr;
return new_node;
}
Subscribe to:
Posts (Atom)