File indexing completed on 2024-04-06 12:31:46
0001 #include "Utilities/General/interface/precomputed_value_sort.h"
0002
0003 #include <vector>
0004 #include <iterator>
0005 #include <iostream>
0006 #include <cmath>
0007 #include <cassert>
0008
0009 using namespace std;
0010
0011
0012 class Point;
0013
0014
0015 class Phi {
0016 public:
0017 explicit Phi(double iV) : value_(iV) {}
0018 operator double() const { return value_; }
0019
0020 private:
0021 double value_;
0022 };
0023
0024 class Point {
0025 public:
0026 Point(float x = 0, float y = 0);
0027 float r() const { return sqrt(X * X + Y * Y); }
0028 Phi phi() const { return Phi(atan2(Y, X)); }
0029 float X, Y;
0030 };
0031
0032 ostream& operator<<(ostream& o, const Point& p) {
0033 return o << "[p=(" << p.X << "," << p.Y << "); r=" << p.r() << " phi=" << p.phi() << "]";
0034 }
0035
0036 ostream& operator<<(ostream& o, const Point* p) { return o << *p; }
0037
0038 Point::Point(float x, float y) : X(x), Y(y) { cout << "New Point" << *this << endl; }
0039
0040
0041 float extractR1(const Point& p) { return p.r(); }
0042
0043
0044 float extractR2(const Point* p) { return p->r(); }
0045
0046
0047 Phi extractPhi2(const Point* p) { return p->phi(); }
0048
0049
0050 bool lessR(const double& a, const double& b) { return a < b; }
0051
0052
0053
0054
0055
0056
0057 bool lessDPhi(const Phi& a, const Phi& b) { return b - a > 0.; }
0058
0059 int main() {
0060
0061 vector<Point> v1;
0062 v1.reserve(6);
0063 v1.push_back(Point(-1.343, 2.445));
0064 v1.push_back(Point(-1.566, 1.678));
0065 v1.push_back(Point(-1.678, 1.569));
0066 v1.push_back(Point(-3.138, 5.321));
0067 v1.push_back(Point(-5.12, 0.321));
0068 v1.push_back(Point(-5.12, -0.321));
0069
0070 vector<float> r;
0071 r.reserve(v1.size());
0072 vector<float> phi;
0073 phi.reserve(v1.size());
0074 for (vector<Point>::iterator i = v1.begin(); i != v1.end(); ++i) {
0075 r.push_back(i->r());
0076 phi.push_back(i->phi());
0077 }
0078 std::sort(r.begin(), r.end());
0079 std::sort(phi.begin(), phi.end());
0080
0081 cout << endl;
0082 cout << "Sorted R's:" << endl;
0083 for (size_t i = 0; i < r.size(); i++) {
0084 cout << r[i] << endl;
0085 }
0086
0087 cout << endl;
0088 cout << "Sorted Phi's:" << endl;
0089 for (size_t i = 0; i < phi.size(); i++) {
0090 cout << phi[i] << endl;
0091 }
0092 cout << endl;
0093
0094
0095 vector<Point*> v2;
0096 for (vector<Point>::iterator i = v1.begin(); i != v1.end(); ++i) {
0097 v2.push_back(&(*i));
0098 }
0099
0100
0101 vector<Point*> v3 = v2;
0102
0103 cout << "Original vector:" << endl;
0104 copy(v1.begin(), v1.end(), ostream_iterator<Point>(cout, "\n"));
0105 cout << endl;
0106
0107
0108 precomputed_value_sort(v1.begin(), v1.end(), extractR1);
0109 cout << "Sorted with ExtractR1 : " << endl;
0110 copy(v1.begin(), v1.end(), ostream_iterator<Point>(cout, "\n"));
0111 cout << endl;
0112 for (size_t i = 0; i < r.size(); i++) {
0113 assert(v1[i].r() == r[i]);
0114 }
0115
0116
0117 cout << "Sorted with ExtractR2: " << endl;
0118 precomputed_value_sort(v2.begin(), v2.end(), extractR2);
0119 copy(v2.begin(), v2.end(), ostream_iterator<Point*>(cout, "\n"));
0120 cout << endl;
0121 for (size_t i = 0; i < r.size(); i++) {
0122 assert(v2[i]->r() == r[i]);
0123 }
0124
0125
0126 cout << "Sort with LessR: " << endl;
0127 precomputed_value_sort(v3.begin(), v3.end(), extractR2, lessR);
0128 copy(v3.begin(), v3.end(), ostream_iterator<Point*>(cout, "\n"));
0129 cout << endl;
0130 for (size_t i = 0; i < r.size(); i++) {
0131 assert(v3[i]->r() == r[i]);
0132 }
0133
0134
0135 cout << "Sort with ExtractPhi2: " << endl;
0136 precomputed_value_sort(v2.begin(), v2.end(), extractPhi2);
0137 copy(v2.begin(), v2.end(), ostream_iterator<Point*>(cout, "\n"));
0138 cout << endl;
0139 for (size_t i = 0; i < phi.size(); i++) {
0140 assert(v2[i]->phi() == phi[i]);
0141 }
0142
0143
0144 cout << "Sort with LessDPhi: " << endl;
0145 precomputed_value_sort(v3.begin(), v3.end(), extractPhi2, lessDPhi);
0146 copy(v3.begin(), v3.end(), ostream_iterator<Point*>(cout, "\n"));
0147 cout << endl;
0148 for (size_t i = 0; i < phi.size(); i++) {
0149 assert(v3[i]->phi() == phi[i]);
0150 }
0151
0152 return 0;
0153 }