6 #include <boost/range/algorithm/find.hpp> 7 #include <boost/range/algorithm/min_element.hpp> 8 #include <boost/range/algorithm_ext/push_back.hpp> 9 #include <boost/range/algorithm/transform.hpp> 10 #include <boost/range/adaptors.hpp> 23 template <
typename Function_>
28 template <
typename Class_,
typename Result_,
typename... Arguments_>
31 enum { arity =
sizeof...(Arguments_) };
34 template <std::
size_t number>
37 using type =
typename std::tuple_element<number, std::tuple<Arguments_...>>
::type;
41 template <
typename Input_,
typename Function_>
42 auto Transform(Input_
const &inputs, Function_
function)
45 auto results = std::vector<Result_> {};
46 if (inputs.empty())
return results;
47 results.reserve(inputs.size());
48 boost::range::transform(inputs, std::back_inserter(results),
function);
53 template<
typename Result_,
typename Input_,
typename Function_>
54 std::vector<Result_>
TransformIf(Input_
const &inputs, Function_
const &function_1, Function_
const &function_2)
56 auto results = std::vector<Result_> {};
57 if (inputs.empty())
return results;
58 boost::range::push_back(results, inputs | boost::adaptors::filtered(function_1) | boost::adaptors::transformed(function_2));
62 template<
typename Elements_,
typename Function_>
63 std::vector<Elements_>
CopyIf(std::vector<Elements_>
const &inputs, Function_
function)
65 std::vector<Elements_> results;
66 return inputs.empty() ? results : boost::range::push_back(results, inputs | boost::adaptors::filtered(std::ref(
function)));
69 template <
typename Element_>
70 std::size_t
Position(std::vector<Element_>
const &vector, Element_
const &element)
72 return std::addressof(element) - vector.data();
75 template <
typename Element_,
unsigned long size_>
76 std::size_t
Position(std::array<Element_, size_>
const &array, Element_
const &element)
78 return std::addressof(element) - array.data();
82 template <
typename Element_>
83 bool FindInVector(
const std::vector<Element_> vector,
const Element_ element)
85 return boost::range::find(vector, element) != vector.end();
88 template <
typename Multiplet_1_,
typename Multiplet_2_>
89 Multiplet_1_
ClosestJet(std::vector<Multiplet_1_>
const &multiplets, Multiplet_2_
const &multiplet)
91 return *boost::range::min_element(multiplets, [&](Multiplet_1_
const & multiplet_1, Multiplet_1_
const & multiplet_2) {
92 return multiplet.DeltaRTo(multiplet_1) < multiplet.DeltaRTo(multiplet_2);
100 template <
typename Element_>
101 std::vector<Element_>
Combine(std::vector<Element_>
const &vector_1, std::vector<Element_>
const &vector_2)
103 auto combined = std::vector<Element_> {};
104 combined.reserve(vector_1.size() + vector_2.size());
105 if (!vector_1.empty()) combined.insert(combined.end(), vector_1.begin(), vector_1.end());
106 if (!vector_2.empty()) combined.insert(combined.end(), vector_2.begin(), vector_2.end());
114 template <
typename Element_>
115 std::vector<Element_>
Combine(std::vector<Element_>
const &vector_1, std::vector<Element_>
const &vector_2, std::vector<Element_>
const &vector_3)
117 auto combined = std::vector<Element_> {};
118 combined.reserve(vector_1.size() + vector_2.size() + vector_3.size());
119 if (!vector_1.empty()) combined.insert(combined.end(), vector_1.begin(), vector_1.end());
120 if (!vector_2.empty()) combined.insert(combined.end(), vector_2.begin(), vector_2.end());
121 if (!vector_3.empty()) combined.insert(combined.end(), vector_3.begin(), vector_3.end());
129 template <
typename Element_>
130 void Insert(std::vector<Element_> &vector_1, std::vector<Element_>
const &vector_2)
132 if (vector_2.empty())
return;
133 vector_1.reserve(vector_1.size() + vector_2.size());
134 vector_1.insert(vector_1.end(), vector_2.begin(), vector_2.end());
141 template <
typename Element_>
142 void Insert(std::vector<Element_> &vector_1, std::vector<Element_>
const &vector_2, std::vector<Element_>
const &vector_3)
144 vector_1.reserve(vector_1.size() + vector_2.size() + vector_3.size());
145 if (!vector_2.empty()) vector_1.insert(vector_1.end(), vector_2.begin(), vector_2.end());
146 if (!vector_3.empty()) vector_1.insert(vector_1.end(), vector_3.begin(), vector_3.end());
153 template <
typename Element_,
155 typename Result =
typename std::result_of<Function&(Element_, Element_)>::type >
156 auto OrderedPairs(std::vector<Element_>
const &container, Function
function)
158 auto results = std::vector<Result> {};
159 for (
auto element_1 = container.begin(); element_1 != container.end(); ++element_1) {
160 for (
auto element_2 = std::next(element_1); element_2 != container.end(); ++element_2) {
162 results.emplace_back(
function(*element_1, *element_2));
163 }
catch (std::exception
const &) {}
165 results.emplace_back(
function(*element_2, *element_1));
166 }
catch (std::exception
const &) {}
176 template < typename Element_, typename Function_, typename Result_ = typename std::result_of<Function_&(Element_, Element_)>::type >
179 auto results = std::vector<Result_> {};
180 for (
auto element_1 = container.begin(); element_1 != container.end(); ++element_1) {
181 for (
auto element_2 = std::next(element_1); element_2 != container.end(); ++element_2)
183 results.emplace_back(
function(*element_1, *element_2));
184 }
catch (std::exception
const &) {}
193 template < typename Element_1_, typename Element_2_, typename Function_, typename Result_ = typename std::result_of<Function_&(Element_1_, Element_2_)>::type >
194 auto Pairs(std::vector<Element_1_>
const &container_1, std::vector<Element_2_>
const &container_2, Function_
function)
196 auto results = std::vector<Result_> {};
197 for (
auto const &element_1 : container_1) {
198 for (
auto const &element_2 : container_2) {
200 results.emplace_back(
function(element_1, element_2));
201 }
catch (std::exception
const &) {}
211 template <
typename Element_1_,
214 typename Result_ =
typename std::result_of<Function_&(Element_1_, Element_1_, Element_2_)>::type >
215 auto Triples(std::vector<Element_1_>
const &container_1, std::vector<Element_2_>
const &container_2, Function_
function)
217 auto results = std::vector<Result_> {};
218 for (
auto element_1 = container_1.begin(); element_1 != container_1.end(); ++element_1) {
219 for (
auto element_2 = std::next(element_1); element_2 != container_1.end(); ++element_2)
220 for (
auto &element_3 : container_2) {
222 results.emplace_back(
function(*element_1, *element_2, element_3));
223 }
catch (std::exception
const &) {}
233 template <
typename Element_1_,
237 typename Result_ =
typename std::result_of<Function_&(Element_1_, Element_2_, Element_3_)>::type >
238 auto Triples(std::vector<Element_1_>
const &container_1, std::vector<Element_2_>
const &container_2, std::vector<Element_3_>
const &container_3, Function_
function)
240 auto results = std::vector<Result_> {};
241 for (
auto const &element_1 : container_1) {
242 for (
auto const &element_2 : container_2) {
243 for (
auto const &element_3 : container_3) {
245 results.emplace_back(
function(element_1, element_2, element_3));
246 }
catch (std::exception
const &) {}
257 template <
typename Element_1_,
260 typename Function_1_,
261 typename Function_2_,
262 typename Result_1_ =
typename std::result_of<Function_1_&(Element_1_, Element_2_)>::type,
263 typename Result_2_ =
typename std::result_of<Function_2_&(Result_1_, Element_3_)>::type >
264 auto Triples(std::vector<Element_1_>
const &container_1, std::vector<Element_2_>
const &container_2, std::vector<Element_3_>
const &container_3, Function_1_ function_1, Function_2_ function_2)
266 auto results = std::vector<Result_2_> {};
267 for (
auto const &element_1 : container_1) {
268 for (
auto const &element_2 : container_2) {
270 auto pair = function_1(element_1, element_2);
271 for (
auto const &element_3 : container_3) {
273 results.emplace_back(function_2(pair, element_3));
274 }
catch (std::exception
const &) {}
276 }
catch (std::exception
const &) {}
std::size_t Position(std::vector< Element_ > const &vector, Element_ const &element)
Definition: Vector.hh:70
bool FindInVector(const std::vector< Element_ > vector, const Element_ element)
Definition: Vector.hh:83
auto Triples(std::vector< Element_1_ > const &container_1, std::vector< Element_2_ > const &container_2, Function_ function)
forms all triples, applies to them the function and returns a vector of its results ...
Definition: Vector.hh:215
typename std::tuple_element< number, std::tuple< Arguments_... >>::type type
Definition: Vector.hh:37
auto Pairs(std::vector< Element_1_ > const &container_1, std::vector< Element_2_ > const &container_2, Function_ function)
forms all pairs of the elements in the two containers, applies the function and returns a vector of ...
Definition: Vector.hh:194
auto UnorderedPairs(std::vector< Element_ > const &container, Function_ function)
forms all unordered pairs, applies to them the function and returns a vector of its results ...
Definition: Vector.hh:177
std::vector< Element_ > Combine(std::vector< Element_ > const &vector_1, std::vector< Element_ > const &vector_2)
Combine two std::vector.
Definition: Vector.hh:101
std::vector< Result_ > TransformIf(Input_ const &inputs, Function_ const &function_1, Function_ const &function_2)
Definition: Vector.hh:54
Boosted Collider Analysis.
Definition: Analysis.hh:15
Multiplet_1_ ClosestJet(std::vector< Multiplet_1_ > const &multiplets, Multiplet_2_ const &multiplet)
Definition: Vector.hh:89
void Insert(std::vector< Element_ > &vector_1, std::vector< Element_ > const &vector_2)
Insert two std::vector.
Definition: Vector.hh:130
auto Transform(Input_ const &inputs, Function_ function)
Definition: Vector.hh:42
auto OrderedPairs(std::vector< Element_ > const &container, Function function)
forms all ordered pairs of vector elements, applies to them the function and returns a vector of its...
Definition: Vector.hh:156
std::vector< Elements_ > CopyIf(std::vector< Elements_ > const &inputs, Function_ function)
Definition: Vector.hh:63
Result_ result_type
Definition: Vector.hh:32