00001
00002
00003
00004 #ifndef DUNE_STREAMOPERATORS_HH
00005 #define DUNE_STREAMOPERATORS_HH
00006
00011 #include <array>
00012 #include <tuple>
00013
00014 #include <dune/common/hybridutilities.hh>
00015 #include <dune/common/std/utility.hh>
00016
00017 namespace Dune
00018 {
00024
00025 template<typename Stream, typename... Ts>
00026 inline Stream& operator<<(Stream& stream, const std::tuple<Ts...>& t)
00027 {
00028 stream<<"[";
00029 if(sizeof...(Ts)>0)
00030 {
00031 Hybrid::forEach(Std::make_index_sequence<sizeof...(Ts)-1>{},
00032 [&](auto i){stream<<std::get<i>(t)<<",";});
00033 stream<<std::get<sizeof...(Ts)-1>(t);
00034 }
00035 stream<<"]";
00036 return stream;
00037 }
00038
00040 template<typename Stream, typename... Ts>
00041 inline Stream& operator>>(Stream& stream, std::tuple<Ts...>& t)
00042 {
00043 Hybrid::forEach(Std::make_index_sequence<sizeof...(Ts)>{},
00044 [&](auto i){stream>>std::get<i>(t);});
00045 return stream;
00046 }
00047
00049 template<typename Stream, typename T, std::size_t N>
00050 inline Stream& operator<<(Stream& stream, const std::array<T,N>& a)
00051 {
00052 stream<<"[";
00053 if(N>0)
00054 {
00055 for(std::size_t i=0; i<N-1; ++i)
00056 stream<<a[i]<<",";
00057 stream<<a[N-1];
00058 }
00059 stream<<"]";
00060 return stream;
00061 }
00062
00065 }
00066
00067 #endif