[Insight-developers] Class vs Namespace
Bradley Lowekamp
blowekamp at mail.nih.gov
Tue Aug 11 10:18:18 EDT 2009
Has some one run the experiment with VS6 to know if:
namespace Math {
template <typename TReturn, typename TInput>
inline TReturn Round(TInput x) { [snip] }
}
will not compile in a namespace?
Luis,
The expected usage of:
The second argument is fro msvc 6 compatibility
template <typename TReturn, typename TInput>
inline TReturn Round(TInput x, TReturn * = 0)
{
return Detail::RoundHelper<TReturn>(x);
}
is:
int rounded = Round<int>( intToRound );
On Aug 11, 2009, at 9:52 AM, Luis Ibanez wrote:
>
> Hi Tom,
>
> Le'ts not use pointers as the return type.
>
> If we do,
> then we have to deal with:
> NULL pointers
> Unallocated pointers
> Deallocated pointers
> Let's use references, so we can ensure that the
> variable receiving the data actually exists.
>
>
> Luis
>
>
> ---------------------------------------
> On Tue, Aug 11, 2009 at 8:01 AM, Tom Vercauteren <tom.vercauteren at m4x.org
> > wrote:
> Hi Brad,
>
> From a totally subjective point of view, I prefer the namespace
> approach. The only issue I still have is about the backward
> compatibility policy. The rounding functions need some helper
> functions. It would be better if those helper functions were not
> subject to any backward compatibility requirement. Here are three
> possibilities I can think of:
>
>
> 1) All namespace approach
> ---------------------------------------
> Advantage: seems clearer to me
> Drawback: No control on the access to th helper functions in
> Math::Detail
>
> namespace Math
> {
> const double p = 3.14;
>
> namespace Detail
> {
> // Things here are excluded from the backward-compatibility policy
> template <typename TReturn, typename TInput>
> inline TReturn RoundHelper(TInput x, TReturn * = 0) { [snip] }
> }
>
> // The second argument is fro msvc 6 compatibility
> template <typename TReturn, typename TInput>
> inline TReturn Round(TInput x, TReturn * = 0)
> {
> return Detail::RoundHelper<TReturn>(x);
> }
> }
>
>
>
> 2) All class approach
> --------------------------------
> Advantage: Helper functions not accessible to the users
> Drawback: Somehow confusing for me to have a class with only static
> members and functions (Also potential compiler optimization loss??)
>
> class Math
> {
> public:
> static const double pi;
>
> template <typename TReturn, typename TInput>
> static inline TReturn Round(TInput x, TReturn * = 0)
> {
> return RoundHelper<TReturn>(x);
> }
>
> private:
> template <typename TReturn, typename TInput>
> static inline TReturn RoundHelper(TInput x, TReturn * = 0) { [snip] }
> };
>
> const double Math::pi = 3.14;
>
>
>
> 3) Mixed namespace-class approach
> -----------------------------------------------------
> Advantage: Helper functions not accessible to the users, constants are
> defined next to their declaration
> Drawback: More complex code due to template friend functions
>
> namespace Math
> {
> const double p = 3.14;
>
> // Forward declarations
> class MathDetail;
> template<typename TReturn, typename TInput>
> TReturn Round(TInput, TReturn *);
>
> class MathDetail
> {
> public:
> template<typename TReturn, typename TInput>
> friend inline TReturn Round(TInput x, TReturn * = 0);
>
> private:
> template <typename TReturn, typename TInput>
> static inline TReturn RoundHelper(TInput x, TReturn * = 0)
> { [snip] }
> }
>
> template <typename TReturn, typename TInput>
> inline TReturn Round(TInput x, TReturn * = 0)
> {
> return MathDetail::RoundHelper<TReturn>(x);
> }
> }
>
>
> It seems to me we should wait until after the release to implement any
> of these option. What do you think?
>
> Cheers,
> Tom
>
>
> On Sat, Aug 8, 2009 at 16:18, Bradley
> Lowekamp<blowekamp at mail.nih.gov> wrote:
> > Currently we have two things we would like to put into itk::Math,
> weather it
> > be a namespace or a class. The first is the rounding methods and
> the second
> > is the numeric constants. For the numeric constants consider these
> two
> > different possibilities:
> >
> >
> > math.h:
> > class Math
> > {
> > static const double p;
> > }
> >
> > math.cxx:
> > const double p = 3.14;
> >
> > Where as with a namespace, we don't need the static qualifier and
> I believe
> > the following will not have the linking issues, and is valid c++:
> >
> > math.h:
> > namespace Math {
> > const double p = 3.14;
> > };
> >
> >
> > With the namespace implementation we can always get optimizations,
> but there
> > will be multiple addresses in different compilation files. I don't
> believe
> > that that latter is really a negative though.
> >
> >
> > Brad
> >
> >
> > On Aug 6, 2009, at 11:21 AM, Tom Vercauteren wrote:
> >
> >> Hi Brad,
> >>
> >> Moving these mathematical constants to a more visible place sounds
> >> good to me. However, handling floating point constants in c++ is a
> >> pain. For example, the following code is not standard and won't be
> >> usable on several systems (mac gcc 4.0 at least):
> >>
> >> class No_Good {
> >> static double const d = 1.0;
> >> };
> >>
> >> I guess that's why boost chose to implement these constants as
> >> template functions:
> >>
> >> http://www.boost.org/doc/libs/1_39_0/libs/math/doc/sf_and_dist/html/math_toolkit/toolkit/internals1/constants.html
> >>
> >> The other option is to decouple the definition and declaration as
> done
> >> in vnl (with some ugly macro):
> >>
> >> class Now_Better
> >> {
> >> static double const d;
> >> };
> >>
> >> double const Now_Better::d = 1.0;
> >>
> >> More information can be found here:
> >>
> >> http://stackoverflow.com/questions/370283/why-cant-i-have-a-non-integral-static-const-member-in-a-class
> >>
> >> No matter the implementation, I would definitely vote for replacing
> >> the current hard-coded values by a common thing such as
> vnl_math::pi,
> >> itk::Math::pi, or itk::Math::pi<double>().
> >>
> >> My two cents,
> >> Tom
> >>
> >> On Thu, Aug 6, 2009 at 16:40, Bradley Lowekamp<blowekamp at mail.nih.gov
> >
> >> wrote:
> >>>
> >>> Hello,
> >>>
> >>> I was looking at:
> >>>
> >>> BasicFilters/itkBilateralImageFilter.txx: rangeGaussianDenom =
> >>> m_RangeSigma*vcl_sqrt(2.0*3.1415927);
> >>>
> >>> It took me a little bit to figure out that we most likely should
> be using
> >>> vnl_math::pi, along with their "e and all that". I do wonder if
> these
> >>> constants were in itk::Math and in doxygen if it would help with
> >>> increased
> >>> usage.
> >>>
> >>> So I began greping in the "Code" directory and came up with the
> >>> following:
> >>>
> >>> grep -r 3.1415 *
> >>> BasicFilters/itkBilateralImageFilter.txx: rangeGaussianDenom =
> >>> m_RangeSigma*vcl_sqrt(2.0*3.1415927);
> >>> BasicFilters/itkVectorGradientMagnitudeImageFilter.txx: const
> double dpi
> >>> =
> >>> 3.14159265358979323846;
> >>> Common/itkGaussianDerivativeSpatialFunction.txx: prefixDenom *=
> >>> 2*vcl_pow( 2 * 3.1415927, VImageDimension / 2.0);
> >>> Common/itkMersenneTwisterRandomVariateGenerator.h: double phi =
> 2.0 *
> >>> 3.14159265358979323846264338328
> >>> Numerics/itkCumulativeGaussianOptimizer.cxx:
> m_ComputedAmplitude = sum
> >>> /
> >>> (m_ComputedStandardDeviation * vcl_sqrt(2*3.14159265));
> >>>
> >>> grep -r 0.707 *
> >>> BasicFilters/itkBSplineResampleImageFilterBase.txx: m_G[0] =
> >>> 0.707107;
> >>>
> >>> grep -r 1.414 *
> >>> Numerics/Statistics/itkGaussianDistribution.cxx: dq = 0.5e+0 *
> >>> vnl_erfc(
> >>> dx / 1.414213562373095e+0 ) - dp;
> >>> Review/Statistics/itkGaussianDistribution.cxx: dq = 0.5e+0 *
> >>> vnl_erfc(
> >>> dx / 1.414213562373095e+0 ) - dp;
> >>>
> >>> grep -r vnl_math:: * | wc
> >>> 69 571 7652
> >>>
> >>> Well I guess that is almost 90% usage of the numeric constants,
> so its
> >>> not
> >>> bad at all.
> >>>
> >>> I'll work on a patch tonight, and likely commit something
> tomorrow if no
> >>> one
> >>> sees a problem with this.
> >>>
> >>> Brad
> >>> _______________________________________________
> >>> Powered by www.kitware.com
> >>>
> >>> Visit other Kitware open-source projects at
> >>> http://www.kitware.com/opensource/opensource.html
> >>>
> >>> Please keep messages on-topic and check the ITK FAQ at:
> >>> http://www.itk.org/Wiki/ITK_FAQ
> >>>
> >>> Follow this link to subscribe/unsubscribe:
> >>> http://www.itk.org/mailman/listinfo/insight-developers
> >>>
> >
> >
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-developers
>
========================================================
Bradley Lowekamp
Lockheed Martin Contractor for
Office of High Performance Computing and Communications
National Library of Medicine
blowekamp at mail.nih.gov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/mailman/private/insight-developers/attachments/20090811/07c1cc23/attachment.htm>
More information about the Insight-developers
mailing list