summaryrefslogtreecommitdiff
path: root/include/cosv/tpl/tpltools.hxx
blob: 487a74cf823701c33b27c6449fe635d1143ca7e6 (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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/* -*- 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 CSV_TPLTOOLS_HXX
#define CSV_TPLTOOLS_HXX

#include <vector>
#include <map>




namespace csv
{


template <class COLLECTION>
inline void         erase_container(
                        COLLECTION &        o_rCollection );

/// Version for other containers than std::map, with non-pair value_type.
template <class COLLECTION>
void                erase_container_of_heap_ptrs(
                        COLLECTION &        o_rCollection );


template <class KEY, class VAL>
const VAL *         find_in_map(            /// Usable for all kinds of values
                        const std::map< KEY, VAL > &
                                            i_rMap,
                        const KEY &         i_rKey );


/** @return the value in the map, if it is in there, else 0.
    @precond VAL has to be convertible to "0".
*/
template <class KEY, class VAL>
VAL                 value_from_map(
                        const std::map< KEY, VAL > &
                                            i_rMap,
                        const KEY &         i_rKey );

/** @return the value in the map, if it is in there, else i_notFound.
*/
template <class KEY, class VAL>
VAL                 value_from_map(
                        const std::map< KEY, VAL > &
                                            i_rMap,
                        const KEY &         i_rKey,
                        VAL                 i_notFound );

template <class COLLECTION, class VALUE>
bool                contains(
                        const COLLECTION &  i_collection,
                        const VALUE &       i_value );




// IMPLEMENTATION
template <class COLLECTION>
inline void
erase_container( COLLECTION & o_rCollection )
{
    o_rCollection.erase( o_rCollection.begin(),
                         o_rCollection.end() );
}

template <class COLLECTION>
void
erase_container_of_heap_ptrs( COLLECTION & o_rCollection )
{
    typename COLLECTION::iterator itEnd = o_rCollection.end();
    for ( typename COLLECTION::iterator it = o_rCollection.begin();
          it != itEnd;
          ++it )
    {
        delete *it;
    }

    o_rCollection.erase( o_rCollection.begin(),
                         o_rCollection.end() );
}

template <class KEY, class VAL>
const VAL *
find_in_map( const std::map< KEY, VAL > & i_rMap,
             const KEY &                  i_rKey )
{
    typename std::map< KEY, VAL >::const_iterator
            ret =  i_rMap.find(i_rKey);
    return ret != i_rMap.end()
                ?   & (*ret).second
                :   (const VAL*)0;
}

template <class KEY, class VAL>
VAL
value_from_map( const std::map< KEY, VAL > & i_rMap,
                const KEY &                  i_rKey )
{
    typename std::map< KEY, VAL >::const_iterator
            ret =  i_rMap.find(i_rKey);
    return ret != i_rMap.end()
                ?   (*ret).second
                :   VAL(0);
}

template <class KEY, class VAL>
VAL
value_from_map( const std::map< KEY, VAL > & i_rMap,
                const KEY &                  i_rKey,
                VAL                          i_notFound )
{
    typename std::map< KEY, VAL >::const_iterator
            ret =  i_rMap.find(i_rKey);
    return ret != i_rMap.end()
                ?   (*ret).second
                :   i_notFound;
}

template <class COLLECTION, class VALUE>
bool
contains( const COLLECTION &  i_collection,
          const VALUE &       i_value )
{
    return std::find(i_collection.begin(), i_collection.end(), i_value)
           !=
           i_collection.end();
}




}   // namespace csv
#endif

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