#ifndef STATEACTIONPAIR_H
#define	STATEACTIONPAIR_H

#include <memory>

namespace storm {
    namespace storage {
        class StateActionPair {
            std::pair<uint_fast64_t, uint_fast64_t> stateActionPair;
            
        public:
            StateActionPair(std::pair<uint_fast64_t, uint_fast64_t> const& sap) : stateActionPair(sap) {}
            StateActionPair(uint_fast64_t state, uint_fast64_t action) : stateActionPair(std::make_pair(state, action)) {}
            
            uint_fast64_t getState() const { 
                return stateActionPair.first;
            }
            
            uint_fast64_t getAction() const {
                return stateActionPair.second;
            }
            
            friend bool operator==(StateActionPair const& p1, StateActionPair const& p2) {
                return p1.stateActionPair == p2.stateActionPair;
            }
            
            friend bool operator!=(StateActionPair const& p1, StateActionPair const& p2) {
                return p1.stateActionPair != p2.stateActionPair;
            }
            
            
        };
    }
}

namespace std {
    template<>
    struct hash<storm::storage::StateActionPair> {
        size_t operator()(storm::storage::StateActionPair const& sap) {
            return (sap.getState() << 3 ^ sap.getAction());
        }
    };
	
}

#endif	/* STATEACTIONPAIR_H */