-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathsort.cpp
109 lines (96 loc) · 3.45 KB
/
sort.cpp
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
#include "sort.h"
#include "merge_sort.h"
#include "radix_sort.h"
#define BLOCK_SIZE 256
bool TRTC_Sort(DVVectorLike& vec, const Functor& comp)
{
if (comp.name_view_cls() == "Less")
{
std::string elem_type = vec.name_elem_cls();
if (elem_type == "int8_t" || elem_type == "uint8_t" || elem_type == "int16_t" || elem_type == "uint16_t"
|| elem_type == "int32_t" || elem_type == "uint32_t" || elem_type == "float")
return radix_sort_32(vec);
else if (elem_type == "int64_t" || elem_type == "uint64_t" || elem_type == "double")
return radix_sort_64(vec);
}
else if (comp.name_view_cls() == "Greater")
{
std::string elem_type = vec.name_elem_cls();
if (elem_type == "int8_t" || elem_type == "uint8_t" || elem_type == "int16_t" || elem_type == "uint16_t"
|| elem_type == "int32_t" || elem_type == "uint32_t" || elem_type == "float")
return radix_sort_reverse_32(vec);
else if (elem_type == "int64_t" || elem_type == "uint64_t" || elem_type == "double")
return radix_sort_reverse_64(vec);
}
return merge_sort(vec, comp);
}
bool TRTC_Sort(DVVectorLike& vec)
{
Functor comp("Less");
return TRTC_Sort(vec, comp);
}
bool TRTC_Sort_By_Key(DVVectorLike& keys, DVVectorLike& values, const Functor& comp)
{
if (comp.name_view_cls() == "Less")
{
std::string elem_type = keys.name_elem_cls();
if (elem_type == "int8_t" || elem_type == "uint8_t" || elem_type == "int16_t" || elem_type == "uint16_t"
|| elem_type == "int32_t" || elem_type == "uint32_t" || elem_type == "float")
return radix_sort_by_key_32(keys, values);
else if (elem_type == "int64_t" || elem_type == "uint64_t" || elem_type == "double")
return radix_sort_by_key_64(keys, values);
}
else if (comp.name_view_cls() == "Greater")
{
std::string elem_type = keys.name_elem_cls();
if (elem_type == "int8_t" || elem_type == "uint8_t" || elem_type == "int16_t" || elem_type == "uint16_t"
|| elem_type == "int32_t" || elem_type == "uint32_t" || elem_type == "float")
return radix_sort_by_key_reverse_32(keys, values);
else if (elem_type == "int64_t" || elem_type == "uint64_t" || elem_type == "double")
return radix_sort_by_key_reverse_64(keys, values);
}
return merge_sort_by_key(keys, values, comp);
}
bool TRTC_Sort_By_Key(DVVectorLike& keys, DVVectorLike& values)
{
Functor comp("Less");
return TRTC_Sort_By_Key(keys, values, comp);
}
bool TRTC_Is_Sorted(const DVVectorLike& vec, const Functor& comp, bool& result)
{
if (vec.size()<=1)
{
result = true;
return true;
}
static TRTC_For s_for({ "vec", "comp", "res" }, "idx",
" if (comp(vec[idx+1], vec[idx])) res[0] = false;\n");
result = true;
DVVector dvres("bool", 1, &result);
const DeviceViewable* args[] = { &vec, &comp, &dvres };
if (!s_for.launch_n(vec.size() - 1, args)) return false;
dvres.to_host(&result);
return true;
}
bool TRTC_Is_Sorted(const DVVectorLike& vec, bool& result)
{
Functor comp("Less");
return TRTC_Is_Sorted(vec, comp, result);
}
#include "general_find.h"
bool TRTC_Is_Sorted_Until(const DVVectorLike& vec, const Functor& comp, size_t& result)
{
size_t res_find = vec.size() - 1;
if (vec.size()>1)
{
Functor src({ {"vec", &vec}, {"comp", &comp} }, { "id" }, " return comp(vec[id+1], vec[id]);\n");
if (!general_find(vec.size()-1, src, res_find)) return false;
}
result = res_find == (size_t)(-1) ? vec.size() : res_find + 1;
return true;
}
bool TRTC_Is_Sorted_Until(const DVVectorLike& vec, size_t& result)
{
Functor comp("Less");
return TRTC_Is_Sorted_Until(vec, comp, result);
}