From 93e84ab56cbcfff5a9569f39615480fcbd4e498a Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Sun, 10 Aug 2014 21:33:30 +0400 Subject: [PATCH] OStream helper class --- libuavcan/include/uavcan/helpers/ostream.hpp | 60 +++++++++++++++++++ .../dsdl_test/dsdl_uavcan_compilability.cpp | 10 ++++ 2 files changed, 70 insertions(+) create mode 100644 libuavcan/include/uavcan/helpers/ostream.hpp diff --git a/libuavcan/include/uavcan/helpers/ostream.hpp b/libuavcan/include/uavcan/helpers/ostream.hpp new file mode 100644 index 0000000000..447b0b9a5e --- /dev/null +++ b/libuavcan/include/uavcan/helpers/ostream.hpp @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2014 Pavel Kirienko + */ + +#pragma once + +#include +#include + +namespace uavcan +{ +/** + * Compact replacement for std::ostream for use on embedded systems. + * Can be used for printing UAVCAN messages to stdout. + * + * Relevant discussion: https://groups.google.com/forum/#!topic/px4users/6c1CLNutN90 + * + * Usage: + * OStream::instance() << "Hello world!" << OStream::endl; + */ +class OStream : uavcan::Noncopyable +{ + OStream() { } + +public: + static OStream& instance() + { + static OStream s; + return s; + } + + static OStream& endl(OStream& stream) + { + std::printf("\n"); + return stream; + } +}; + +OStream& operator<<(OStream& s, long long x) { std::printf("%lld", x); return s; } +OStream& operator<<(OStream& s, unsigned long long x) { std::printf("%llud", x); return s; } + +OStream& operator<<(OStream& s, long x) { std::printf("%ld", x); return s; } +OStream& operator<<(OStream& s, unsigned long x) { std::printf("%lu", x); return s; } + +OStream& operator<<(OStream& s, int x) { std::printf("%d", x); return s; } +OStream& operator<<(OStream& s, unsigned int x) { std::printf("%u", x); return s; } + +OStream& operator<<(OStream& s, short x) { return operator<<(s, static_cast(x)); } +OStream& operator<<(OStream& s, unsigned short x) { return operator<<(s, static_cast(x)); } + +OStream& operator<<(OStream& s, long double x) { std::printf("%Lg", x); return s; } +OStream& operator<<(OStream& s, double x) { std::printf("%g", x); return s; } +OStream& operator<<(OStream& s, float x) { return operator<<(s, static_cast(x)); } + +OStream& operator<<(OStream& s, char x) { std::printf("%c", x); return s; } +OStream& operator<<(OStream& s, const char* x) { std::printf("%s", x); return s; } + +OStream& operator<<(OStream& s, OStream&(*manip)(OStream&)) { return manip(s); } + +} diff --git a/libuavcan/test/dsdl_test/dsdl_uavcan_compilability.cpp b/libuavcan/test/dsdl_test/dsdl_uavcan_compilability.cpp index 9ddabbf8ff..4506151dc9 100644 --- a/libuavcan/test/dsdl_test/dsdl_uavcan_compilability.cpp +++ b/libuavcan/test/dsdl_test/dsdl_uavcan_compilability.cpp @@ -4,6 +4,8 @@ #include +#include + #include #include #include @@ -112,3 +114,11 @@ TEST(Dsdl, Streaming) std::cout << os.str(); ASSERT_EQ(Reference, os.str()); } + + +TEST(Dsdl, OStream) +{ + root_ns_a::Deep ps; + ps.a.resize(2); + uavcan::OStream::instance() << ps << uavcan::OStream::endl; +}