/// /// \file enumStrings.h /// \author Jan Chrin, PSi /// \brief Modified from Astari's C++11 version. /// Use boost::begin() boost::end() for C++ /// \date Release: February 2015 /// \version CAFE 1.0.0 /// #ifndef ENUMSTRINGS_H #define ENUMSTRINGS_H #include #include #include #include #include #include template struct enumStrings { static char const* data[]; }; template struct enumRefHolder { T& enumVal; enumRefHolder(T& enumVal): enumVal(enumVal) {} }; template struct enumConstRefHolder { T const& enumVal; enumConstRefHolder(T const& enumVal): enumVal(enumVal) {} }; template inline std::ostream& operator<<(std::ostream& str, enumConstRefHolder const& data) { //Add check on enumStrings::data size to ensure correspondence with entries in cafeEnumEpics.h if ( boost::size( enumStrings::data) > (unsigned int) data.enumVal) { return str << enumStrings::data[data.enumVal]; } else { return str << "ERROR: enumStrings.h reports data.enumVal= " << data.enumVal << " DOES NOT HAVE A STRING EQUIVALENT!"; } } template inline std::istream& operator>>(std::istream& str, enumRefHolder const& data) { std::string value; str >> value; // These two can be made easier to read in C++11 // using std::begin() and std::end() //static auto begin = std::begin(enumStrings::data); //static auto end = std::end(enumStrings::data); //auto find = std::find(begin, end, value); //if (find != end) if ( std::find( boost::begin(enumStrings::data), boost::end( enumStrings::data), value) != boost::end( enumStrings::data)) { //data.enumVal = static_cast(std::distance(begin, find)); data.enumVal = static_cast(std::distance(boost::begin(enumStrings::data), std::find (boost::begin(enumStrings::data), boost::end(enumStrings::data), value ) )); } if (data.enumVal > boost::size( enumStrings::data) ) { std::cout << "ERROR: enumStrings.h reports data.enumVal = " << data.enumVal << " is out of enum range = " << boost::size( enumStrings::data) << std::endl; } return str; } template enumConstRefHolder enumToString(T const& e) { return enumConstRefHolder(e); } template enumRefHolder enumFromString(T& e) { return enumRefHolder(e); } #endif // ENUMSTRINGS_H