1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2001-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
10 /// @file    VectorHelper.h
11 /// @author  Daniel Krajzewicz
12 /// @author  Jakob Erdmann
13 /// @author  Michael Behrisch
14 /// @date    Sept 2002
15 /// @version $Id$
16 ///
17 // A simple vector of doubles
18 /****************************************************************************/
19 #ifndef VectorHelper_h
20 #define VectorHelper_h
21 
22 
23 // ===========================================================================
24 // included modules
25 // ===========================================================================
26 
27 #include <vector>
28 #include <limits>
29 #include <algorithm>
30 #include <iostream>
31 
32 
33 // ===========================================================================
34 // class definitions
35 // ===========================================================================
36 /**
37  *
38  */
39 template<class T>
40 class VectorHelper {
41 public:
sum(const std::vector<T> & v)42     static T sum(const std::vector<T>& v) {
43         T sum = 0;
44         for (typename std::vector<T>::const_iterator i = v.begin(); i != v.end(); i++) {
45             sum += *i;
46         }
47         return sum;
48     }
49 
50     static void normaliseSum(std::vector<T>& v, T msum = 1.0) {
51         if (msum == 0 || v.size() == 0) {
52             // is an error; do nothing
53             return;
54         }
55         T rsum = sum(v);
56         if (rsum == 0) {
57             set(v, (T) 1.0 * msum / (T) v.size());
58             return;
59         }
60         div(v, rsum / msum);
61     }
62 
div(std::vector<T> & v,T by)63     static void div(std::vector<T>& v, T by) {
64         for (typename std::vector<T>::iterator i = v.begin(); i != v.end(); i++) {
65             *i /= by;
66         }
67     }
68 
removeDouble(std::vector<T> & v)69     static void removeDouble(std::vector<T>& v) {
70         typename std::vector<T>::iterator i = v.begin();
71         while (i != v.end()) {
72             for (typename std::vector<T>::iterator j = i + 1; j != v.end();) {
73                 if (*i == *j) {
74                     j = v.erase(j);
75                 } else {
76                     j++;
77                 }
78             }
79             i++;
80         }
81     }
82 
83 
set(std::vector<T> & v,T to)84     static void set(std::vector<T>& v, T to) {
85         for (typename std::vector<T>::iterator i = v.begin(); i != v.end(); i++) {
86             *i = to;
87         }
88     }
89 
maxValue(const std::vector<T> & v)90     static T maxValue(const std::vector<T>& v) {
91         T m = -std::numeric_limits<T>::max();
92         for (typename std::vector<T>::const_iterator j = v.begin() ; j != v.end(); j++) {
93             if ((*j) > m) {
94                 m = *j;
95             }
96         }
97         return m;
98     }
99 
minValue(const std::vector<T> & v)100     static T minValue(const std::vector<T>& v) {
101         T m = std::numeric_limits<T>::max();
102         for (typename std::vector<T>::const_iterator j = v.begin(); j != v.end(); j++) {
103             if ((*j) < m) {
104                 m = *j;
105             }
106         }
107         return m;
108     }
109 
remove_smaller_than(std::vector<T> & v,T swell)110     static void remove_smaller_than(std::vector<T>& v, T swell) {
111         for (typename std::vector<T>::iterator j = v.begin(); j != v.end();) {
112             if ((*j) < swell) {
113                 j = v.erase(j);
114             } else {
115                 j++;
116             }
117         }
118     }
119 
remove_larger_than(std::vector<T> & v,T swell)120     static void remove_larger_than(std::vector<T>& v, T swell) {
121         for (typename std::vector<T>::iterator j = v.begin(); j != v.end();) {
122             if ((*j) > swell) {
123                 j = v.erase(j);
124             } else {
125                 j++;
126             }
127         }
128     }
129 
add2All(std::vector<T> & v,T what)130     static void add2All(std::vector<T>& v, T what) {
131         for (typename std::vector<T>::iterator j = v.begin(); j != v.end(); j++) {
132             (*j) += what;
133         }
134     }
135 
136     /// Returns the information whether at least one element is within both vectors
subSetExists(const std::vector<T> & v1,const std::vector<T> & v2)137     static bool subSetExists(const std::vector<T>& v1, const std::vector<T>& v2) {
138         for (typename std::vector<T>::const_iterator i = v1.begin(); i != v1.end(); i++) {
139             int val1 = (*i);
140             if (find(v2.begin(), v2.end(), val1) != v2.end()) {
141                 return true;
142             }
143         }
144         return false;
145     }
146 
147 
148 
149 };
150 
151 template<class T>
152 std::ostream& operator<<(std::ostream& os, const std::vector<T>& v) {
153     for (typename std::vector<T>::const_iterator i = v.begin(); i != v.end(); i++) {
154         if (i != v.begin()) {
155             os << ", ";
156         }
157         os << (*i);
158     }
159     return os;
160 }
161 
162 
163 
164 #endif
165 
166 /****************************************************************************/
167 
168