#pragma once

#include <vector>
#include <map>
#include <string>

namespace storm {
    namespace automata {
        class APSet {
        public:
            // TODO: uint32
            typedef std::size_t alphabet_element;

            APSet();

            unsigned int size() const;
            std::size_t alphabetSize() const;
            void add(const std::string& ap);
            unsigned int getIndex(const std::string& ap) const;
            bool contains(const std::string& ap) const;
            const std::string& getAP(unsigned int index) const;
            const std::vector<std::string>& getAPs() const;

            alphabet_element elementAllFalse() const;
            alphabet_element elementAddAP(alphabet_element element, unsigned int ap) const;

            const unsigned int MAX_APS = 32;
        private:
            std::map<std::string, unsigned int> ap_to_index;
            std::vector<std::string> index_to_ap;
        };
    }
}