summaryrefslogtreecommitdiff
path: root/chart2/source/inc/CommonFunctors.hxx
blob: 4e0eeb680631fef47fdbb0981c0bc265940c4971 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (the "License"); you may not use this file
 *   except in compliance with the License. You may obtain a copy of
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */
#ifndef INCLUDED_CHART2_SOURCE_INC_COMMONFUNCTORS_HXX
#define INCLUDED_CHART2_SOURCE_INC_COMMONFUNCTORS_HXX

#include <algorithm>
#include <functional>
#include <o3tl/any.hxx>
#include <rtl/math.hxx>
#include <com/sun/star/uno/Any.hxx>
#include <rtl/ustring.hxx>
#include "charttoolsdllapi.hxx"

namespace chart
{
namespace CommonFunctors
{

/** unary function to convert any type T into a css::uno::Any.

    <p>uno::makeAny is an inline function.  Thus is cannot be taken directly
    (via mem_fun_ptr)</p>
*/
template< typename T >
    struct makeAny : public std::unary_function< T, css::uno::Any >
{
    css::uno::Any operator() ( const T & aVal )
    {
        return css::uno::makeAny( aVal );
    }
};

/** unary function to convert css::uno::Any into a double number.

    <p>In case no number can be generated from the Any, NaN (see
    rtl::math::SetNAN()) is returned.</p>
*/
struct OOO_DLLPUBLIC_CHARTTOOLS AnyToDouble : public std::unary_function< css::uno::Any, double >
{
    double operator() ( const css::uno::Any & rAny )
    {
        double fResult;
        ::rtl::math::setNan( & fResult );
        rAny >>= fResult;
        return fResult;
    }
};

/** unary function to convert css::uno::Any into an
    OUString.
*/
struct OOO_DLLPUBLIC_CHARTTOOLS AnyToString : public std::unary_function< css::uno::Any,  OUString >
{
    OUString operator() ( const css::uno::Any & rAny )
    {
        if( auto pDouble = o3tl::tryAccess<double>(rAny) )
        {
            if( ::rtl::math::isNan(*pDouble) )
                return OUString();
            return ::rtl::math::doubleToUString(
                * pDouble,
                rtl_math_StringFormat_Automatic,
                rtl_math_DecimalPlaces_Max, // use maximum decimal places available
                sal_Char( '.' ), // decimal separator
                true // remove trailing zeros
                );
        }
        else if( auto s = o3tl::tryAccess<OUString>(rAny) )
        {
            return *s;
        }

        return OUString();
    }
};

/** unary function to convert an OUString into a double number.

    <p>For conversion rtl::math::StringToDouble is used.</p>
 */
struct OOO_DLLPUBLIC_CHARTTOOLS OUStringToDouble : public std::unary_function< OUString, double >
{
    double operator() ( const OUString & rStr )
    {
        rtl_math_ConversionStatus eConversionStatus;
        double fResult = ::rtl::math::stringToDouble( rStr, '.', ',', & eConversionStatus );

        if( eConversionStatus != rtl_math_ConversionStatus_Ok )
            ::rtl::math::setNan( & fResult );

        return fResult;
    }
};

/** unary function to convert a double number into an OUString.

    <p>For conversion rtl::math::DoubleToOUString is used.</p>
 */
struct OOO_DLLPUBLIC_CHARTTOOLS DoubleToOUString : public std::unary_function< double, OUString >
{
    OUString operator() ( double fNumber )
    {
        return ::rtl::math::doubleToUString(
            fNumber,
            rtl_math_StringFormat_Automatic,
            rtl_math_DecimalPlaces_Max, // use maximum decimal places available
            static_cast< sal_Char >( '.' ),
            true
            );
    }
};

} //  namespace CommonFunctors
} //  namespace chart

// INCLUDED_CHART2_SOURCE_INC_COMMONFUNCTORS_HXX
#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */