Boost logo

Boost-Commit :

From: dgregor_at_[hidden]
Date: 2008-08-19 13:30:33


Author: dgregor
Date: 2008-08-19 13:30:32 EDT (Tue, 19 Aug 2008)
New Revision: 48222
URL: http://svn.boost.org/trac/boost/changeset/48222

Log:
Use FloatingPointType requirement for complex
Text files modified:
   sandbox/committee/concepts/stdlib/clib-concepts.tex | 48 ++++++++++++
   sandbox/committee/concepts/stdlib/clib-numerics.tex | 141 +++++++++++++++------------------------
   2 files changed, 98 insertions(+), 91 deletions(-)

Modified: sandbox/committee/concepts/stdlib/clib-concepts.tex
==============================================================================
--- sandbox/committee/concepts/stdlib/clib-concepts.tex (original)
+++ sandbox/committee/concepts/stdlib/clib-concepts.tex 2008-08-19 13:30:32 EDT (Tue, 19 Aug 2008)
@@ -126,6 +126,12 @@
 \item In the \tcode{FreeStoreAllocatable} concept, default the
   implementations of operators \tcode{new[]} and \tcode{delete[]} to
   the use \tcode{new} and \tcode{delete}, respectively.
+
+\item Added the \tcode{ArithmeticType} and \tcode{FloatingPointType}
+ concepts.
+
+\item Added the \tcode{underlying_type} associated type to the
+ \tcode{EnumerationType} concept.
 \end{itemize}
 
 \end{titlepage}
@@ -207,10 +213,12 @@
   concept StandardLayoutType<typename T> @\textit{see below}@;
   concept LiteralType<typename T> @\textit{see below}@;
   concept ScalarType<typename T> @\textit{see below}@;
+ concept ArithmeticType<typename T> @\textit{see below}@;
   concept NonTypeTemplateParameterType<typename T> @\textit{see below}@;
   concept IntegralConstantExpressionType<typename T> @\textit{see below}@;
   concept IntegralType<typename T> @\textit{see below}@;
   concept EnumerationType<typename T> @\textit{see below}@;
+ concept FloatingPointType<typename T> @\textit{see below}@;
   concept SameType<typename T, typename U> { }
   concept DerivedFrom<typename Derived, typename Base> { }
 
@@ -540,6 +548,20 @@
 \end{itemdescr}
 
 \begin{itemdecl}
+concept ArithmeticType<typename T> : ScalarType<T> { }
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\addedConcepts{\mbox{\reallynote} describes arithmetic types (\mbox{\ref{basic.fundamental}}).}
+
+\pnum
+\addedConcepts{\mbox{\requires} for every type \mbox{\tcode{T}} that
+ is an arithmetic type, a concept map \mbox{\tcode{ArithmeticType<T>}} shall
+ be implicitly defined in namespace \mbox{\tcode{std}}.}
+\end{itemdescr}
+
+\begin{itemdecl}
 concept NonTypeTemplateParameterType<typename T> : VariableType<T> { }
 \end{itemdecl}
 
@@ -574,7 +596,8 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-concept IntegralType<typename T> : IntegralConstantExpressionType<T> { }
+concept IntegralType<typename T>
+ : IntegralConstantExpressionType<T>, ArithmeticType<T> { }
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -590,13 +613,16 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-concept EnumerationType<typename T> : IntegralConstantExpressionType<T> { }
+concept EnumerationType<typename T> : IntegralConstantExpressionType<T> {
+ IntegralType underlying_type;
+}
 \end{itemdecl}
 
 \begin{itemdescr}
 \pnum
 \addedConcepts{\mbox{\reallynote} describes enumeration types
-([dcl.enum]).}
+([dcl.enum]). \mbox{\tcode{underlying_type}} is the underlying type of
+the enumeration type.}
 
 \pnum
 \addedConcepts{\mbox{\requires}
@@ -606,6 +632,22 @@
 \end{itemdescr}
 
 \begin{itemdecl}
+concept FloatingPointType<typename T> : ArithmeticType<T> { }
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\addedConcepts{\mbox{\reallynote} describes floating point types
+(\mbox{\ref{basic.fundamental}}).}
+
+\pnum
+\addedConcepts{\mbox{\requires}
+for every type \mbox{\tcode{T}} that is a floating point type, a concept map
+\mbox{\tcode{FloatingPointType<T>}} shall be implicitly defined in namespace
+\mbox{\tcode{std}}.}
+\end{itemdescr}
+
+\begin{itemdecl}
 concept SameType<typename T, typename U> { }
 \end{itemdecl}
 

Modified: sandbox/committee/concepts/stdlib/clib-numerics.tex
==============================================================================
--- sandbox/committee/concepts/stdlib/clib-numerics.tex (original)
+++ sandbox/committee/concepts/stdlib/clib-numerics.tex 2008-08-19 13:30:32 EDT (Tue, 19 Aug 2008)
@@ -76,6 +76,9 @@
   \tcode{inner_product}, \tcode{partial_sum}, and
   \tcode{adjacent_difference} to cope with move semantics and changes
   to the foundational concepts.
+\item The complex transcendentals and other non-member operations
+ require \tcode{FloatingPointType}, which more accurately
+ characterizes the actual requirements for the \tcode{complex} type.
 \end{itemize}
 
 \end{titlepage}
@@ -510,49 +513,39 @@
   template<@\changedConcepts{class}{ArithmeticLike}@ T> T real(const complex<T>&);
   template<@\changedConcepts{class}{ArithmeticLike}@ T> T imag(const complex<T>&);
 
- template<class T> @\addedConcepts{requires HasSqrt<T>}@ T abs(const complex<T>&);
- template<class T> @\addedConcepts{requires HasAtan2<T>}@ T arg(const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> T abs(const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> T arg(const complex<T>&);
   template<@\changedConcepts{class}{ArithmeticLike}@ T> T norm(const complex<T>&);
 
   template<@\changedConcepts{class}{ArithmeticLike}@ T> complex<T> conj(const complex<T>&);
   @\ptr_at_template<@\changedConcepts{class}{ArithmeticLike}@ T> complex<T> fabs(const complex<T>&);
- template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T>}@ complex<T> polar(const T&, const T& = 0);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> polar(const T&, const T& = 0);
 
   // \ref{complex.transcendentals} transcendentals:
- template<class T> @\addedConcepts{requires HasSqrt<T> \&\& HasLog<T>}@ complex<T> acos(const complex<T>&);
- template<class T> @\addedConcepts{requires HasSqrt<T> \&\& HasLog<T>}@ complex<T> asin(const complex<T>&);
- template<class T> @\addedConcepts{requires HasAtan2<T> \&\& HasLog<T>}@ complex<T> atan(const complex<T>&);
-
- template<class T> @\addedConcepts{requires HasSqrt<T> \&\& HasLog<T>}@ complex<T> acosh(const complex<T>&);
- template<class T> @\addedConcepts{requires HasSqrt<T> \&\& HasLog<T>}@ complex<T> asinh(const complex<T>&);
- template<class T> @\addedConcepts{requires HasAtan2<T> \&\& HasLog<T>}@ complex<T> atanh(const complex<T>&);
-
- template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasSinh<T> \&\& HasCosh<T>}@
- complex<T> cos (const complex<T>&);
- template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasSinh<T> \&\& HasCosh<T>}@
- complex<T> cosh (const complex<T>&);
- template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasExp<T>}@
- complex<T> exp (const complex<T>&);
- template<class T> @\addedConcepts{requires HasAtan2<T> \&\& HasExp<T>}@ complex<T> log (const complex<T>&);
- template<class T> @\addedConcepts{requires HasAtan2<T> \&\& HasExp<T>}@ complex<T> log10(const complex<T>&);
-
- template<class T> @\addedConcepts{requires ArithmeticLike<T>}@ complex<T> pow(const complex<T>&, int);
- template<class T> @\addedConcepts{requires HasPow<T> \&\& HasLog<T> \&\& HasSin<T> \&\& HasCos<T>}@
- complex<T> pow(const complex<T>&, const T&);
- template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasExp<T> \&\& HasAtan2<T>}@
- complex<T> pow(const complex<T>&, const complex<T>&);
- template<class T> @\addedConcepts{requires HasPow<T> \&\& HasSin<T> \&\& HasCos<T> \&\& HasExp<T> \&\& HasAtan2<T>}@
- complex<T> pow(const T&, const complex<T>&);
-
- template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasSinh<T> \&\& HasCosh<T>}@
- complex<T> sin (const complex<T>&);
- template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasSinh<T> \&\& HasCosh<T>}@
- complex<T> sinh (const complex<T>&);
- template<class T> @\addedConcepts{requires HasSqrt<T>}@ complex<T> sqrt (const complex<T>&);
- template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasSinh<T> \&\& HasCosh<T>}@
- complex<T> tan (const complex<T>&);
- template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasSinh<T> \&\& HasCosh<T>}@
- complex<T> tanh (const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> acos(const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> asin(const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> atan(const complex<T>&);
+
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> acosh(const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> asinh(const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> atanh(const complex<T>&);
+
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> cos (const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> cosh (const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> exp (const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> log (const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> log10(const complex<T>&);
+
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> pow(const complex<T>&, int);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> pow(const complex<T>&, const T&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> pow(const complex<T>&, const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> pow(const T&, const complex<T>&);
+
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> sin (const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> sinh (const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> sqrt (const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> tan (const complex<T>&);
+ template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> tanh (const complex<T>&);
 }
 \end{codeblock}
 
@@ -703,23 +696,6 @@
 
 \rSec2[complex.members]{\tcode{complex}\ member functions}
 
-\index{complex@\tcode{complex}!\tcode{complex}}%
-\begin{itemdecl}
-template<@\changedConcepts{class}{ArithmeticLike}@ T> @\addedConcepts{requires Constructible<T, X>}@
- complex(const T& @\farg{re}@ = T(), const T& @\farg{im}@ = T());
-\end{itemdecl}
-
-\begin{itemdescr}
-\pnum
-\effects\
-Constructs an object of class
-\tcode{complex}.
-
-\pnum
-\postcondition\
-\tcode{real() == \farg{re}\ \&\& imag() == \farg{im}}.
-\end{itemdescr}
-
 \rSec2[complex.member.ops]{\tcode{complex}\ member operators}
 
 \index{operator+=@\tcode{operator+=}!\tcode{complex}}%
@@ -1086,7 +1062,7 @@
 
 \index{abs@\tcode{abs}!\tcode{complex}}%
 \begin{itemdecl}
-template<class T> @\addedConcepts{requires HasSqrt<T>}@ T abs(const complex<T>& @\farg{x}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> T abs(const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1097,7 +1073,7 @@
 
 \index{arg@\tcode{arg}!\tcode{complex}}%
 \begin{itemdecl}
-template<class T> @\addedConcepts{requires HasAtan2<T>}@ T arg(const complex<T>& @\farg{x}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> T arg(const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1141,8 +1117,7 @@
 
 \index{polar@\tcode{polar}!\tcode{complex}}%
 \begin{itemdecl}
-template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T>}@
- complex<T> polar(const T& @\farg{rho}@, const T& @\farg{theta}@ = 0);
+template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> polar(const T& @\farg{rho}@, const T& @\farg{theta}@ = 0);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1160,7 +1135,7 @@
 \index{acos@\tcode{acos}!\tcode{complex}}%
 \index{cacos@\tcode{cacos}!\tcode{complex}}%
 \begin{itemdecl}
-@\ptr_at_template<class T> @\addedConcepts{requires HasSqrt<T> \&\& HasLog<T>}@ complex<T> acos(const complex<T>& @\farg{x}@);
+@\ptr_at_template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> acos(const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1171,7 +1146,7 @@
 \index{asin@\tcode{asin}!\tcode{complex}}%
 \index{casin@\tcode{casin}!\tcode{complex}}%
 \begin{itemdecl}
-@\ptr_at_template<class T> @\addedConcepts{requires HasSqrt<T> \&\& HasLog<T>}@ complex<T> asin(const complex<T>& @\farg{x}@);
+@\ptr_at_template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> asin(const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1182,7 +1157,7 @@
 \index{atan@\tcode{atan}!\tcode{complex}}%
 \index{catan@\tcode{catan}!\tcode{complex}}%
 \begin{itemdecl}
-@\ptr_at_template<class T> @\addedConcepts{requires HasAtan2<T> \&\& HasLog<T>}@ complex<T> atan(const complex<T>& @\farg{x}@);
+@\ptr_at_template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> atan(const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1193,7 +1168,7 @@
 \index{acosh@\tcode{acosh}!\tcode{complex}}%
 \index{cacosh@\tcode{cacosh}!\tcode{complex}}%
 \begin{itemdecl}
-@\ptr_at_template<class T> @\addedConcepts{requires HasSqrt<T> \&\& HasLog<T>}@ complex<T> acosh(const complex<T>& @\farg{x}@);
+@\ptr_at_template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> acosh(const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1204,7 +1179,7 @@
 \index{asinh@\tcode{asinh}!\tcode{complex}}%
 \index{casinh@\tcode{casinh}!\tcode{complex}}%
 \begin{itemdecl}
-@\ptr_at_template<class T> @\addedConcepts{requires HasSqrt<T> \&\& HasLog<T>}@ complex<T> asinh(const complex<T>& @\farg{x}@);
+@\ptr_at_template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> asinh(const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1215,7 +1190,7 @@
 \index{atanh@\tcode{atanh}!\tcode{complex}}%
 \index{catanh@\tcode{catanh}!\tcode{complex}}%
 \begin{itemdecl}
-@\ptr_at_template<class T> @\addedConcepts{requires HasAtan2<T> \&\& HasLog<T>}@ complex<T> atanh(const complex<T>& @\farg{x}@);
+@\ptr_at_template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> atanh(const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1225,8 +1200,7 @@
 
 \index{cos@\tcode{cos}!\tcode{complex}}%
 \begin{itemdecl}
-template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasSinh<T> \&\& HasCosh<T>}@
- complex<T> cos(const complex<T>& @\farg{x}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> cos(const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1237,8 +1211,7 @@
 
 \index{cosh@\tcode{cosh}!\tcode{complex}}%
 \begin{itemdecl}
-template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasSinh<T> \&\& HasCosh<T>}@
- complex<T> cosh(const complex<T>& @\farg{x}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> cosh(const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1249,7 +1222,7 @@
 
 \index{exp@\tcode{exp}!\tcode{complex}}%
 \begin{itemdecl}
-template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasExp<T>}@ complex<T> exp(const complex<T>& @\farg{x}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> exp(const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1260,7 +1233,7 @@
 
 \index{log@\tcode{log}!\tcode{complex}}%
 \begin{itemdecl}
-template<class T> @\addedConcepts{requires HasAtan2<T> \&\& HasExp<T>}@ complex<T> log(const complex<T>& @\farg{x}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> log(const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1282,7 +1255,7 @@
 
 \index{log10@\tcode{log10}!\tcode{complex}}%
 \begin{itemdecl}
-template<class T> @\addedConcepts{requires HasAtan2<T> \&\& HasExp<T>}@ complex<T> log10(const complex<T>& @\farg{x}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> log10(const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1298,14 +1271,10 @@
 
 \index{pow@\tcode{pow}!\tcode{complex}}%
 \begin{itemdecl}
-template<class T> @\addedConcepts{requires ArithmeticLike<T>}@ complex<T> pow(const complex<T>& @\farg{x}@, int @\farg{y}@);
-template<class T>
- complex<T> @\addedConcepts{requires HasPow<T> \&\& HasLog<T> \&\& HasSin<T> \&\& HasCos<T>}@
- pow(const complex<T>& @\farg{x}@, const complex<T>& @\farg{y}@);
-template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasExp<T> \&\& HasAtan2<T>}@ complex<T>
- pow (const complex<T>& @\farg{x}@, const T& @\farg{y}@);
-template<class T> @\addedConcepts{requires HasPow<T> \&\& HasSin<T> \&\& HasCos<T> \&\& HasExp<T> \&\& HasAtan2<T>}@
- complex<T> pow (const T& @\farg{x}@, const complex<T>& @\farg{y}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> pow(const complex<T>& @\farg{x}@, int @\farg{y}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> pow(const complex<T>& @\farg{x}@, const complex<T>& @\farg{y}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> pow(const complex<T>& @\farg{x}@, const T& @\farg{y}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> pow (const T& @\farg{x}@, const complex<T>& @\farg{y}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1325,8 +1294,7 @@
 
 \index{sin@\tcode{sin}!\tcode{complex}}%
 \begin{itemdecl}
-template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasSinh<T> \&\& HasCosh<T>}@
- complex<T> sin (const complex<T>& @\farg{x}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> sin (const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1337,8 +1305,7 @@
 
 \index{sinh@\tcode{sinh}!\tcode{complex}}%
 \begin{itemdecl}
-template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasSinh<T> \&\& HasCosh<T>}@
- complex<T> sinh (const complex<T>& @\farg{x}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> sinh (const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1349,7 +1316,7 @@
 
 \index{sqrt@\tcode{sqrt}!\tcode{complex}}%
 \begin{itemdecl}
-template<class T> @\addedConcepts{requires HasSqrt<T>}@ complex<T> sqrt (const complex<T>& @\farg{x}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> sqrt (const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1367,8 +1334,7 @@
 
 \index{tan@\tcode{tan}!\tcode{complex}}%
 \begin{itemdecl}
-template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasSinh<T> \&\& HasCosh<T>}@
- complex<T> tan (const complex<T>& @\farg{x}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> tan (const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1379,8 +1345,7 @@
 
 \index{tanh@\tcode{tanh}!\tcode{complex}}%
 \begin{itemdecl}
-template<class T> @\addedConcepts{requires HasSin<T> \&\& HasCos<T> \&\& HasSinh<T> \&\& HasCosh<T>}@
- complex<T> tanh (const complex<T>& @\farg{x}@);
+template<@\changedConcepts{class}{FloatingPointType}@ T> complex<T> tanh (const complex<T>& @\farg{x}@);
 \end{itemdecl}
 
 \begin{itemdescr}


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk