Skip to content
Snippets Groups Projects
Commit 050d2db0 authored by Brad Kittenbrink's avatar Brad Kittenbrink
Browse files

Added LLAPRSockStream class and associated LLAPRSockStreambuf class for

DEV-31978 viewer event host socket module.

reviewed by palmer+nat+mani.
parent 820d4a20
No related branches found
No related tags found
No related merge requests found
...@@ -22,6 +22,7 @@ include_directories( ...@@ -22,6 +22,7 @@ include_directories(
set(llcommon_SOURCE_FILES set(llcommon_SOURCE_FILES
llapp.cpp llapp.cpp
llapr.cpp llapr.cpp
llaprsockstream.cpp
llassettype.cpp llassettype.cpp
llbase32.cpp llbase32.cpp
llbase64.cpp llbase64.cpp
...@@ -94,6 +95,7 @@ set(llcommon_HEADER_FILES ...@@ -94,6 +95,7 @@ set(llcommon_HEADER_FILES
llagentconstants.h llagentconstants.h
llapp.h llapp.h
llapr.h llapr.h
llaprsockstream.h
llassettype.h llassettype.h
llassoclist.h llassoclist.h
llavatarconstants.h llavatarconstants.h
...@@ -236,6 +238,7 @@ target_link_libraries( ...@@ -236,6 +238,7 @@ target_link_libraries(
${BOOST_REGEX_LIBRARY} ${BOOST_REGEX_LIBRARY}
) )
ADD_BUILD_TEST(llaprsockstream llcommon)
ADD_BUILD_TEST(lllazy llcommon) ADD_BUILD_TEST(lllazy llcommon)
ADD_BUILD_TEST(lleventfilter llcommon) ADD_BUILD_TEST(lleventfilter llcommon)
ADD_BUILD_TEST(lleventcoro llcommon) ADD_BUILD_TEST(lleventcoro llcommon)
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#define LL_STRINGIZE_H #define LL_STRINGIZE_H
#include <sstream> #include <sstream>
#include <boost/lambda/lambda.hpp>
/** /**
* stringize(item) encapsulates an idiom we use constantly, using * stringize(item) encapsulates an idiom we use constantly, using
...@@ -27,6 +28,17 @@ std::string stringize(const T& item) ...@@ -27,6 +28,17 @@ std::string stringize(const T& item)
return out.str(); return out.str();
} }
/**
* stringize_f(functor)
*/
template <typename Functor>
std::string stringize_f(Functor const & f)
{
std::ostringstream out;
f(out);
return out.str();
}
/** /**
* STRINGIZE(item1 << item2 << item3 ...) effectively expands to the * STRINGIZE(item1 << item2 << item3 ...) effectively expands to the
* following: * following:
...@@ -36,40 +48,43 @@ std::string stringize(const T& item) ...@@ -36,40 +48,43 @@ std::string stringize(const T& item)
* return out.str(); * return out.str();
* @endcode * @endcode
*/ */
#define STRINGIZE(EXPRESSION) (static_cast<std::ostringstream&>(Stringize() << EXPRESSION).str()) #define STRINGIZE(EXPRESSION) (stringize_f(boost::lambda::_1 << EXPRESSION))
/** /**
* Helper class for STRINGIZE() macro. Ideally the body of * destringize(str)
* STRINGIZE(EXPRESSION) would look something like this: * defined for symmetry with stringize
* *NOTE - this has distinct behavior from boost::lexical_cast<T> regarding
* leading/trailing whitespace and handling of bad_lexical_cast exceptions
*/
template <typename T>
T destringize(std::string const & str)
{
T val;
std::istringstream in(str);
in >> val;
return val;
}
/**
* destringize_f(str, functor)
*/
template <typename Functor>
void destringize_f(std::string const & str, Functor const & f)
{
std::istringstream in(str);
f(in);
}
/**
* DESTRINGIZE(str, item1 >> item2 >> item3 ...) effectively expands to the
* following:
* @code * @code
* (std::ostringstream() << EXPRESSION).str() * std::istringstream in(str);
* in >> item1 >> item2 >> item3 ... ;
* @endcode * @endcode
* That doesn't work because each of the relevant operator<<() functions
* accepts a non-const std::ostream&, to which you can't pass a temp instance
* of std::ostringstream. Stringize plays the necessary const tricks to make
* the whole thing work.
*/ */
class Stringize #define DESTRINGIZE(STR, EXPRESSION) (destringize_f((STR), (boost::lambda::_1 >> EXPRESSION)))
{
public:
/**
* This is the essence of Stringize. The leftmost << operator (the one
* coded in the STRINGIZE() macro) engages this operator<<() const method
* on the temp Stringize instance. Every other << operator (ones embedded
* in EXPRESSION) simply sees the std::ostream& returned by the first one.
*
* Finally, the STRINGIZE() macro downcasts that std::ostream& to
* std::ostringstream&.
*/
template <typename T>
std::ostream& operator<<(const T& item) const
{
mOut << item;
return mOut;
}
private:
mutable std::ostringstream mOut;
};
#endif /* ! defined(LL_STRINGIZE_H) */ #endif /* ! defined(LL_STRINGIZE_H) */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment