// Jarod42

#include <algorithm>
#include <cassert>
#include <iostream>
#include <iterator>
#include <vector>

bool increase(std::vector<bool>& bs)
{
    for (std::size_t i = 0; i != bs.size(); ++i) {
        bs[i] = !bs[i];
        if (bs[i] == true) {
            return true;
        }
    }
    return false; // overflow
}

template <typename T, typename F>
void PowerSet(const std::vector<T>& v, F f)
{
    std::vector<bool> bitset(v.size());

    do {
    	f(v, bitset);
    } while (increase(bitset));
}

template <typename T, typename F>
void AllArrangements(const std::vector<T>& v, F f)
{
	PowerSet(v, [f](const std::vector<T>& v, const std::vector<bool>& bitset){
		std::vector<T> toPermute;
		for (std::size_t i = 0; i != v.size(); ++i) {
            if (bitset[i]) {
                toPermute.push_back(v[i]);
            }
        }
        do {
			f(toPermute);
        } while (std::next_permutation(toPermute.begin(), toPermute.end()));
	});
}


int main()
{
    std::vector<char> vc{ 'A', 'B', 'C', 'D' };
	std::sort(vc.begin(), vc.end());
    std::cout << "\n------All Arrangements-------------\n";
    AllArrangements(vc,
                    [](const auto& v){
                    	for (const auto& e : v) {
                    		std::cout << e << " "; }
                    	std::cout << std::endl;
                    });
}
