@@ -1763,117 +1763,12 @@ inline void tight_layout() {
1763
1763
Py_DECREF (res);
1764
1764
}
1765
1765
1766
- // Support for variadic plot() and initializer lists:
1767
-
1768
- namespace detail {
1769
-
1770
- template <typename T>
1771
- using is_function = typename std::is_function<
1772
- std::remove_pointer<std::remove_reference<T>>>::type;
1773
-
1774
- template <bool obj, typename T> struct is_callable_impl ;
1775
-
1776
- template <typename T> struct is_callable_impl <false , T> {
1777
- typedef is_function<T> type;
1778
- }; // a non-object is callable iff it is a function
1779
-
1780
- template <typename T> struct is_callable_impl <true , T> {
1781
- struct Fallback {
1782
- void operator ()();
1783
- };
1784
- struct Derived : T, Fallback {};
1785
-
1786
- template <typename U, U> struct Check ;
1787
-
1788
- template <typename U>
1789
- static std::true_type
1790
- test (...); // use a variadic function to make sure (1) it accepts everything
1791
- // and (2) its always the worst match
1792
-
1793
- template <typename U>
1794
- static std::false_type test (Check<void (Fallback::*)(), &U::operator()> *);
1795
-
1796
- public:
1797
- typedef decltype (test<Derived>(nullptr )) type;
1798
- typedef decltype (&Fallback::operator ()) dtype;
1799
- static constexpr bool value = type::value;
1800
- }; // an object is callable iff it defines operator()
1801
-
1802
- template <typename T> struct is_callable {
1803
- // dispatch to is_callable_impl<true, T> or is_callable_impl<false, T>
1804
- // depending on whether T is of class type or not
1805
- typedef typename is_callable_impl<std::is_class<T>::value, T>::type type;
1806
- };
1807
-
1808
- template <typename IsYDataCallable> struct plot_impl {};
1809
-
1810
- template <> struct plot_impl <std::false_type> {
1811
- template <typename IterableX, typename IterableY>
1812
- bool operator ()(const IterableX &x, const IterableY &y,
1813
- const std::string &format) {
1814
- detail::_interpreter::get ();
1815
-
1816
- // 2-phase lookup for distance, begin, end
1817
- using std::begin;
1818
- using std::distance;
1819
- using std::end;
1820
-
1821
- auto xs = distance (begin (x), end (x));
1822
- auto ys = distance (begin (y), end (y));
1823
- assert (xs == ys && " x and y data must have the same number of elements!" );
1824
-
1825
- PyObject *xlist = PyList_New (xs);
1826
- PyObject *ylist = PyList_New (ys);
1827
- PyObject *pystring = PyString_FromString (format.c_str ());
1828
-
1829
- auto itx = begin (x), ity = begin (y);
1830
- for (size_t i = 0 ; i < xs; ++i) {
1831
- PyList_SetItem (xlist, i, PyFloat_FromDouble (*itx++));
1832
- PyList_SetItem (ylist, i, PyFloat_FromDouble (*ity++));
1833
- }
1834
-
1835
- PyObject *plot_args = PyTuple_New (3 );
1836
- PyTuple_SetItem (plot_args, 0 , xlist);
1837
- PyTuple_SetItem (plot_args, 1 , ylist);
1838
- PyTuple_SetItem (plot_args, 2 , pystring);
1839
-
1840
- PyObject *res = PyObject_CallObject (
1841
- detail::_interpreter::get ().s_python_function_plot , plot_args);
1842
-
1843
- Py_DECREF (plot_args);
1844
- if (res)
1845
- Py_DECREF (res);
1846
-
1847
- return res;
1848
- }
1849
- };
1850
-
1851
- template <> struct plot_impl <std::true_type> {
1852
- template <typename Iterable, typename Callable>
1853
- bool operator ()(const Iterable &ticks, const Callable &f,
1854
- const std::string &format) {
1855
- if (begin (ticks) == end (ticks))
1856
- return true ;
1857
-
1858
- // We could use additional meta-programming to deduce the correct element
1859
- // type of y, but all values have to be convertible to double anyways
1860
- std::vector<double > y;
1861
- for (auto x : ticks)
1862
- y.push_back (f (x));
1863
- return plot_impl<std::false_type>()(ticks, y, format);
1864
- }
1865
- };
1866
-
1867
- } // end namespace detail
1868
-
1869
- // recursion stop for the above
1766
+ // recursion stop for the below
1870
1767
template <typename ... Args> bool plot () { return true ; }
1871
1768
1872
1769
template <typename A, typename B, typename ... Args>
1873
1770
bool plot (const A &a, const B &b, const std::string &format, Args... args) {
1874
- return detail::plot_impl<typename detail::is_callable<B>::type>()(a, b,
1875
- format) &&
1876
- plot (args...);
1771
+ return plot (a, b, format) && plot (args...);
1877
1772
}
1878
1773
1879
1774
/*
0 commit comments