[pooma-dev] [PATCH] Another PrintField tweak

Jeffrey D. Oldham oldham at codesourcery.com
Wed Mar 24 10:13:16 UTC 2004


Richard Guenther wrote:

>Hi!
>
>This allows more cases of expression printing, like
>
>pinfo << 2.0*a;
>
>or more complex expressions.
>
>The problem was the
>PerformPrintField<S,A,A::dimensions>::print(*this, s, a.subField(m, c));
>call in the PrintField::print() method and the prototype for the
>PerformPrinfField::print method without a suitable auto-conversion from
>the result type of a.subField(m, c) back to A.
>
>Fixed by effectively removing the Metrowerks workaround and templating
>the member of PerformPrintField on A, S, rather than PerformPrintField
>itself.  The workaround is from 12-Aug-99, so the compiler had rather been
>fixed until now.
>
>The PrintArray counterpart works (including the same workaround), because
>we don't take subfield-views here and the types can match exactly.
>
>  
>

Yes, thanks for improving printing.

>2004Mar23  Richard Guenther <richard.guenther at uni-tuebingen.de>
>
>	* src/Field/PrintField.h: template PerformPrintField on Dim
>	only, template member on stream and field instead.
>
>===== PrintField.h 1.4 vs edited =====
>--- 1.4/r2/src/Field/PrintField.h	Thu Jan 29 12:01:39 2004
>+++ edited/PrintField.h	Tue Mar 23 09:58:02 2004
>@@ -71,23 +71,24 @@
>
> /**
>  * PerformPrintField struct: a simple wrapper around the templated 'print'
>- * method of PrintField.  This is here as a workaround to a Metrowerks
>- * problem that prevents having templated member functions defined as
>- * out-of-line.  This struct defines one static method 'print', which
>+ * method of PrintField.
>+ * This struct defines one static method 'print', which
>  * prints an field to a stream (the two template parameters).  The Dim
>  * parameter is used to specialize this to the case of a 1D domain.  This is
>  * called by the 'print' templated member function of PrintField.
>  */
>
>-template<class S, class A, int Dim>
>+template<int Dim>
> struct PerformPrintField
> {
>+  template <class S, class A>
>   static void print(const PrintField &, S &, const A &);
> };
>
>-template<class S, class A>
>-struct PerformPrintField<S, A, 1>
>+template<>
>+struct PerformPrintField<1>
> {
>+  template<class S, class A>
>   static void print(const PrintField &, S &, const A &);
> };
>
>@@ -239,7 +240,7 @@
>           {
>             s << "Material #" << m << ", Centering #" << c << " " << a.centering(c)
>               << "\n"<< "-------------\n";
>-            PerformPrintField<S,A,A::dimensions>::print(*this, s, a.subField(m, c));
>+            PerformPrintField<A::dimensions>::print(*this, s, a.subField(m, c));
>           }
>     }
>
>@@ -375,7 +376,7 @@
>
> template<class S, class A>
> void
>-PerformPrintField<S,A,1>::print(const PrintField &p, S &s, const A &a)
>+PerformPrintField<1>::print(const PrintField &p, S &s, const A &a)
> {
>   // make sure this is the right function
>
>@@ -459,9 +460,10 @@
> */
> //-----------------------------------------------------------------------------
>
>-template<class S, class A, int Dim>
>+template<int Dim>
>+template<class S, class A>
> void
>-PerformPrintField<S,A,Dim>::print(const PrintField &p, S &s, const A &a)
>+PerformPrintField<Dim>::print(const PrintField &p, S &s, const A &a)
> {
>   int i, j, k;
>
>  
>


-- 
Jeffrey D. Oldham
oldham at codesourcery.com





More information about the pooma-dev mailing list