// 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>
void PowerSet(const std::vector<T>& v)
{
    std::vector<bool> bitset(v.size());

    do {
        for (std::size_t i = 0; i != v.size(); ++i) {
            if (bitset[i]) {
                std::cout << v[i] << " ";
            }
        }
        std::cout << std::endl;
    } while (increase(bitset));
}

int main()
{
    std::vector<char> vc{ 'A', 'B', 'C', 'D' };
    std::cout << "\n------POWERSET-------------\n";
    PowerSet(vc);
}
