#include <iostream>
#include <vector>
#include <functional>
#include <cinttypes>
using namespace std;
template<class T, uint8_t B>
struct Hui {
static void sort3_impl(vector<T> & arr);
};
template<class T>
struct Hui<T, 0> {
static void sort3_impl(vector<T> &)
{
}
};
template<class T>
struct Hui<T, 1> {
static void sort3_impl(vector<T> & arr)
{
swap(arr[0], arr[1]);
}
};
template<class T>
struct Hui<T, 2> {
static void sort3_impl(vector<T> & arr)
{
swap(arr[1], arr[2]);
}
};
template<class T>
struct Hui<T, 5> {
static void sort3_impl(vector<T> & arr)
{
swap(arr[0], arr[1]);
swap(arr[1], arr[2]);
}
};
template<class T>
struct Hui<T, 6> {
static void sort3_impl(vector<T> & arr)
{
swap(arr[0], arr[2]);
swap(arr[1], arr[2]);
}
};
template<class T>
struct Hui<T, 7> {
static void sort3_impl(vector<T> & arr)
{
swap(arr[0], arr[2]);
}
};
template<class T>
void sort3_runtime_call(vector<T> & arr, uint8_t bits)
{
static array<function<void(vector<T> &)>, 8> func_table = {
Hui<T, 0>::sort3_impl,
Hui<T, 1>::sort3_impl,
Hui<T, 2>::sort3_impl,
Hui<T, 0>::sort3_impl,
Hui<T, 0>::sort3_impl,
Hui<T, 5>::sort3_impl,
Hui<T, 6>::sort3_impl,
Hui<T, 7>::sort3_impl,
};
func_table[bits](arr);
}
template<class T>
void sort3(vector<T> & arr)
{
sort3_runtime_call(arr, (arr[0] > arr[1]) | ((arr[1] > arr[2]) << 1) | ((arr[0] > arr[2]) << 2));
}
int main()
{
vector<vector<uint32_t>> tests = {
{1, 2, 3}, {1, 3, 2}, {2, 1, 3},
{2, 3, 1}, {3, 1, 2}, {3, 2, 1},
};
for (auto && arr : tests) {
sort3(arr);
cout << arr[0] << ", " << arr[1] << ", " << arr[2] << endl;
}
return EXIT_SUCCESS;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGNpbnR0eXBlcz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTxjbGFzcyBULCB1aW50OF90IEI+CnN0cnVjdCBIdWkgewogICAgc3RhdGljIHZvaWQgc29ydDNfaW1wbCh2ZWN0b3I8VD4gJiBhcnIpOwp9OwoKdGVtcGxhdGU8Y2xhc3MgVD4Kc3RydWN0IEh1aTxULCAwPiB7CiAgICBzdGF0aWMgdm9pZCBzb3J0M19pbXBsKHZlY3RvcjxUPiAmKQogICAgewogICAgfQp9OwoKdGVtcGxhdGU8Y2xhc3MgVD4Kc3RydWN0IEh1aTxULCAxPiB7CiAgICBzdGF0aWMgdm9pZCBzb3J0M19pbXBsKHZlY3RvcjxUPiAmIGFycikKICAgIHsKICAgICAgICBzd2FwKGFyclswXSwgYXJyWzFdKTsKICAgIH0KfTsKCnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCBIdWk8VCwgMj4gewogICAgc3RhdGljIHZvaWQgc29ydDNfaW1wbCh2ZWN0b3I8VD4gJiBhcnIpCiAgICB7CiAgICAgICAgc3dhcChhcnJbMV0sIGFyclsyXSk7CiAgICB9Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBUPgpzdHJ1Y3QgSHVpPFQsIDU+IHsKICAgIHN0YXRpYyB2b2lkIHNvcnQzX2ltcGwodmVjdG9yPFQ+ICYgYXJyKQogICAgewogICAgICAgIHN3YXAoYXJyWzBdLCBhcnJbMV0pOwogICAgICAgIHN3YXAoYXJyWzFdLCBhcnJbMl0pOwogICAgfQp9OwoKdGVtcGxhdGU8Y2xhc3MgVD4Kc3RydWN0IEh1aTxULCA2PiB7CiAgICBzdGF0aWMgdm9pZCBzb3J0M19pbXBsKHZlY3RvcjxUPiAmIGFycikKICAgIHsKICAgICAgICBzd2FwKGFyclswXSwgYXJyWzJdKTsKICAgICAgICBzd2FwKGFyclsxXSwgYXJyWzJdKTsKICAgIH0KfTsKCnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCBIdWk8VCwgNz4gewogICAgc3RhdGljIHZvaWQgc29ydDNfaW1wbCh2ZWN0b3I8VD4gJiBhcnIpCiAgICB7CiAgICAgICAgc3dhcChhcnJbMF0sIGFyclsyXSk7CiAgICB9Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBUPgp2b2lkIHNvcnQzX3J1bnRpbWVfY2FsbCh2ZWN0b3I8VD4gJiBhcnIsIHVpbnQ4X3QgYml0cykKewogICAgc3RhdGljIGFycmF5PGZ1bmN0aW9uPHZvaWQodmVjdG9yPFQ+ICYpPiwgOD4gZnVuY190YWJsZSA9IHsKICAgICAgICBIdWk8VCwgMD46OnNvcnQzX2ltcGwsCiAgICAgICAgSHVpPFQsIDE+Ojpzb3J0M19pbXBsLAogICAgICAgIEh1aTxULCAyPjo6c29ydDNfaW1wbCwKICAgICAgICBIdWk8VCwgMD46OnNvcnQzX2ltcGwsCiAgICAgICAgSHVpPFQsIDA+Ojpzb3J0M19pbXBsLAogICAgICAgIEh1aTxULCA1Pjo6c29ydDNfaW1wbCwKICAgICAgICBIdWk8VCwgNj46OnNvcnQzX2ltcGwsCiAgICAgICAgSHVpPFQsIDc+Ojpzb3J0M19pbXBsLAogICAgfTsKICAgIGZ1bmNfdGFibGVbYml0c10oYXJyKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4Kdm9pZCBzb3J0Myh2ZWN0b3I8VD4gJiBhcnIpCnsKICAgIHNvcnQzX3J1bnRpbWVfY2FsbChhcnIsIChhcnJbMF0gPiBhcnJbMV0pIHwgKChhcnJbMV0gPiBhcnJbMl0pIDw8IDEpIHwgKChhcnJbMF0gPiBhcnJbMl0pIDw8IDIpKTsKfQoKaW50IG1haW4oKQp7CiAgICB2ZWN0b3I8dmVjdG9yPHVpbnQzMl90Pj4gdGVzdHMgPSB7CiAgICAgICAgezEsIDIsIDN9LCB7MSwgMywgMn0sIHsyLCAxLCAzfSwKICAgICAgICB7MiwgMywgMX0sIHszLCAxLCAyfSwgezMsIDIsIDF9LAogICAgfTsKCiAgICBmb3IgKGF1dG8gJiYgYXJyIDogdGVzdHMpIHsKICAgICAgICBzb3J0MyhhcnIpOwogICAgICAgIGNvdXQgPDwgYXJyWzBdIDw8ICIsICIgPDwgYXJyWzFdIDw8ICIsICIgPDwgYXJyWzJdIDw8IGVuZGw7CiAgICB9CiAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwp9