File: template2template.cc

package info (click to toggle)
c%2B%2B-annotations 13.02.02-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,576 kB
  • sloc: cpp: 25,297; makefile: 1,523; ansic: 165; sh: 126; perl: 90; fortran: 27
file content (141 lines) | stat: -rw-r--r-- 3,364 bytes parent folder | download | duplicates (9)
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
    #include <vector>
    #include <algorithm>
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <iterator>

//SORTWITH
    template <typename Type>
    class SortWith
    {
       bool (Type::*d_ptr)(Type const &rhv) const;
//=
        public:
            SortWith(bool (Type::*ptr)(Type const &rhv) const);
            bool operator()(Type const &lhv, Type const &rhv) const;
    };

//SORTCONS
    template <typename Type>
    SortWith<Type>::SortWith(bool (Type::*ptr)(Type const &rhv) const)
    :
        d_ptr(ptr)
    {}
//=

//OPERATOR
    template <typename Type>
    bool SortWith<Type>::operator()(Type const &lhv, Type const &rhv) const
    {
        return (lhv.*d_ptr)(rhv);
    }
//=

//HEAD
    template <typename Type>
    class SortVector: public std::vector<Type>
    {
        public:
            SortVector()
            {}
            SortVector(Type const *begin, Type const *end)
            :
                std::vector<Type>(begin, end)
            {}
//=
            void hierarchicSort
            (
                bool (Type::**arr)(Type const &rhv) const,
                size_t n
            );
    };

//SORT
    template <typename Type>
    void SortVector<Type>::hierarchicSort(
                bool (Type::**arr)(Type const &rhv) const,
                size_t n)
    {
        while (n--)
            stable_sort(this->begin(), this->end(), SortWith<Type>(arr[n]));
    }
//=
    class MultiData;
    namespace std
    {
        ostream &operator<<(ostream &str, MultiData const &obj);
        istream &operator>>(istream &str, MultiData &obj);
    }

    class MultiData
    {
        friend std::ostream
                &std::operator<<(std::ostream &str, MultiData const &obj);
        friend std::istream
                &std::operator>>(std::istream &str, MultiData &obj);

        std::string d_text;
        int         d_value;

        public:
            bool textCmp(MultiData const &rhv) const
            {
                return d_text < rhv.d_text;
            }
            bool intCmp(MultiData const &rhv) const
            {
                return d_value < rhv.d_value;
            }
    };

    namespace std
    {
        ostream &operator<<(ostream &output, MultiData const &obj)
        {
            return output << obj.d_text << " " << obj.d_value;
        }
        istream &operator>>(istream &input, MultiData &obj)
        {
            return input >> obj.d_text >> obj.d_value;
        }
    }

    using namespace std;

    int main()
    {
//MAIN1
        SortVector<MultiData> sv;

        copy(istream_iterator<MultiData>(cin),
                istream_iterator<MultiData>(),
                back_inserter(sv));
//=
        copy(sv.begin(), sv.end(),
            ostream_iterator<MultiData>(cout, " "));

        cout << "\n====\n";
//ARRAY
        bool (MultiData::*arr[])(MultiData const &rhv) const =
        {
            &MultiData::textCmp,
            &MultiData::intCmp,
        };
//=
//SORT1
        sv.hierarchicSort(arr, 2);
//=
        copy(sv.begin(), sv.end(),
            ostream_iterator<MultiData>(cout, " "));

        cout << "\n====\n";
//SORT2
        swap(arr[0], arr[1]);
        sv.hierarchicSort(arr, 2);
//=
        copy(sv.begin(), sv.end(),
            ostream_iterator<MultiData>(cout, " "));

        cout << "\n====\n";
    }