@@ -742,7 +742,7 @@ struct Error_WasNotContainer {
742742
743743// The unspecialized version of this class gives traits for things that are *not* arrays.
744744template <typename T, typename Enable=void >
745- class ArrayTraits {
745+ class ArrayTraitsImpl {
746746public:
747747 // The value type of elements after all levels of nested containers have been dereferenced.
748748 typedef Error_WasNotContainer value_type;
@@ -765,6 +765,9 @@ class ArrayTraits {
765765 }
766766};
767767
768+ template <typename T>
769+ using ArrayTraits = ArrayTraitsImpl<typename std::remove_reference<typename std::remove_cv<T>::type>::type>;
770+
768771// Most specializations of ArrayTraits should inherit from this (with V set to the value type).
769772// It sets some default values.
770773template <typename V>
@@ -777,16 +780,6 @@ class ArrayTraitsDefaults {
777780 static constexpr size_t depth = ArrayTraits<V>::depth + 1 ;
778781};
779782
780- // This handles reference types, such as are given with std::tie.
781- // It also allows for instance "ArrayTraits<T[N]>" to match "ArrayTraits<T (&) [N]>".
782- // I think this is okay to do... The alternative is to use remove_reference all over the place.
783- template <typename T>
784- class ArrayTraits <T&> : public ArrayTraits<T> { };
785-
786- // This supports gp.send1d(std::forward_as_tuple(x, std::move(y)));
787- template <typename T>
788- class ArrayTraits <T&&> : public ArrayTraits<T> { };
789-
790783// }}}2
791784
792785// {{{2 STL container support
@@ -833,7 +826,7 @@ class IteratorRange {
833826};
834827
835828template <typename T>
836- class ArrayTraits <T,
829+ class ArrayTraitsImpl <T,
837830 typename std::enable_if_t <is_like_stl_container<T>>
838831> : public ArrayTraitsDefaults<typename T::value_type> {
839832public:
@@ -845,7 +838,7 @@ class ArrayTraits<T,
845838};
846839
847840template <typename T>
848- class ArrayTraits <T,
841+ class ArrayTraitsImpl <T,
849842 typename std::enable_if_t <is_like_stl_container2<T>>
850843> : public ArrayTraitsDefaults<typename std::iterator_traits<decltype (begin(std::declval<T const >()))>::value_type> {
851844 using IterType = decltype (begin(std::declval<T const >()));
@@ -863,7 +856,7 @@ class ArrayTraits<T,
863856// {{{2 C style array support
864857
865858template <typename T, size_t N>
866- class ArrayTraits <T[N]> : public ArrayTraitsDefaults<T> {
859+ class ArrayTraitsImpl <T[N]> : public ArrayTraitsDefaults<T> {
867860public:
868861 typedef IteratorRange<const T*, T> range_type;
869862
@@ -918,7 +911,7 @@ class PairOfRange {
918911};
919912
920913template <typename T, typename U>
921- class ArrayTraits <std::pair<T, U>> {
914+ class ArrayTraitsImpl <std::pair<T, U>> {
922915public:
923916 typedef PairOfRange<typename ArrayTraits<T>::range_type, typename ArrayTraits<U>::range_type> range_type;
924917 typedef std::pair<typename ArrayTraits<T>::value_type, typename ArrayTraits<U>::value_type> value_type;
@@ -944,7 +937,7 @@ class ArrayTraits<std::pair<T, U>> {
944937// {{{2 boost::tuple support
945938
946939template <typename T>
947- class ArrayTraits <T,
940+ class ArrayTraitsImpl <T,
948941 typename std::enable_if_t <
949942 is_boost_tuple<T> && !is_boost_tuple_nulltype<typename T::tail_type>
950943 >
@@ -969,7 +962,7 @@ class ArrayTraits<T,
969962};
970963
971964template <typename T>
972- class ArrayTraits <T,
965+ class ArrayTraitsImpl <T,
973966 typename std::enable_if_t <
974967 is_boost_tuple<T> && is_boost_tuple_nulltype<typename T::tail_type>
975968 >
@@ -1015,7 +1008,7 @@ struct StdTupUnwinder<Tuple, 0> {
10151008};
10161009
10171010template <typename ... Args>
1018- class ArrayTraits <std::tuple<Args...>> :
1011+ class ArrayTraitsImpl <std::tuple<Args...>> :
10191012 public ArrayTraits<typename StdTupUnwinder<std::tuple<Args...>, sizeof ...(Args)-1 >::type>
10201013{
10211014 typedef std::tuple<Args...> Tuple;
@@ -2036,9 +2029,7 @@ inline Gnuplot &operator<<(Gnuplot &gp, PlotGroup &&sp) {
20362029
20372030// The first version of this library didn't use namespaces, and now this must be here forever
20382031// for reverse compatibility.
2039- // Saurav: Removed this as this causes forward declaration issues with clang
2040- // using gnuplotio::Gnuplot;
2041- using namespace gnuplotio ;
2032+ using gnuplotio::Gnuplot;
20422033
20432034#endif // GNUPLOT_IOSTREAM_H
20442035
@@ -2161,7 +2152,7 @@ class BlitzIterator<T, ArrayDim, 1> {
21612152};
21622153
21632154template <typename T, int ArrayDim>
2164- class ArrayTraits <blitz::Array<T, ArrayDim>> : public ArrayTraitsDefaults<T> {
2155+ class ArrayTraitsImpl <blitz::Array<T, ArrayDim>> : public ArrayTraitsDefaults<T> {
21652156public:
21662157 static constexpr bool allow_auto_unwrap = false ;
21672158 static constexpr size_t depth = ArrayTraits<T>::depth + ArrayDim;
@@ -2204,7 +2195,7 @@ template <typename T> static constexpr bool dont_treat_as_stl_container<arma::fi
22042195// {{{3 Cube
22052196
22062197template <typename T>
2207- class ArrayTraits <arma::Cube<T>> : public ArrayTraitsDefaults<T> {
2198+ class ArrayTraitsImpl <arma::Cube<T>> : public ArrayTraitsDefaults<T> {
22082199 class SliceRange {
22092200 public:
22102201 SliceRange () : p(nullptr ), col(0 ), slice(0 ) { }
@@ -2374,17 +2365,17 @@ class ArrayTraits_ArmaMatOrField : public ArrayTraitsDefaults<T> {
23742365};
23752366
23762367template <typename T>
2377- class ArrayTraits <arma::field<T>> : public ArrayTraits_ArmaMatOrField<arma::field<T>, T> { };
2368+ class ArrayTraitsImpl <arma::field<T>> : public ArrayTraits_ArmaMatOrField<arma::field<T>, T> { };
23782369
23792370template <typename T>
2380- class ArrayTraits <arma::Mat<T>> : public ArrayTraits_ArmaMatOrField<arma::Mat<T>, T> { };
2371+ class ArrayTraitsImpl <arma::Mat<T>> : public ArrayTraits_ArmaMatOrField<arma::Mat<T>, T> { };
23812372
23822373// }}}3
23832374
23842375// {{{3 Row
23852376
23862377template <typename T>
2387- class ArrayTraits <arma::Row<T>> : public ArrayTraitsDefaults<T> {
2378+ class ArrayTraitsImpl <arma::Row<T>> : public ArrayTraitsDefaults<T> {
23882379public:
23892380 static constexpr bool allow_auto_unwrap = false ;
23902381
@@ -2401,7 +2392,7 @@ class ArrayTraits<arma::Row<T>> : public ArrayTraitsDefaults<T> {
24012392// {{{3 Col
24022393
24032394template <typename T>
2404- class ArrayTraits <arma::Col<T>> : public ArrayTraitsDefaults<T> {
2395+ class ArrayTraitsImpl <arma::Col<T>> : public ArrayTraitsDefaults<T> {
24052396public:
24062397 static constexpr bool allow_auto_unwrap = false ;
24072398
@@ -2564,7 +2555,7 @@ class ArrayTraits_Eigen2D : public ArrayTraitsDefaults<typename RF::value_type>
25642555};
25652556
25662557template <typename T>
2567- class ArrayTraits <T, typename std::enable_if_t <is_eigen_matrix<T>>> :
2558+ class ArrayTraitsImpl <T, typename std::enable_if_t <is_eigen_matrix<T>>> :
25682559 public std::conditional_t <
25692560 T::RowsAtCompileTime == 1 || T::ColsAtCompileTime == 1 ,
25702561 ArrayTraits_Eigen1D<T>,
0 commit comments