You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

193 lines
4.6 KiB

/*
* This file is part of the program ltl2dstar (http://www.ltl2dstar.de/).
* Copyright (C) 2005-2007 Joachim Klein <j.klein@ltl2dstar.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef APSET_H
#define APSET_H
/** @file
*Provides class APSet
*/
#include <cstring>
#include <string>
#include <memory>
#include "common/Exceptions.hpp"
#include <boost/lexical_cast.hpp>
#include <boost/iterator/counting_iterator.hpp>
typedef unsigned int ap_index_t;
/**
* Class representing a set of atomic propsitions (AP).
* This class currently supports a maximum of 31 APs per set!
*/
class APSet {
public:
/**
* Constructor.
*/
explicit APSet() {
array=new std::string[MAX_AP];
array_size=0;
}
/**
* Destructor.
*/
~APSet() { if (array!=0) {delete[] array;}}
/**
* Adds a new AP to the set.
* @param name the name of the AP
* @return the index of the added AP
*/
ap_index_t addAP(const std::string& name) {
ap_index_t new_index=array_size;
if (new_index>=MAX_AP) {
THROW_EXCEPTION(IllegalArgumentException, "Can't add AP, APSet is full");
}
array[new_index]=name; // make copy of name
array_size=new_index+1;
return new_index;
}
/**
* Gets the name of a certain AP.
* @param index index of the AP
* @return string-ref with the name
*/
const std::string& getAP(ap_index_t index) const {
if (index<0 || index >= array_size) {
THROW_EXCEPTION(IndexOutOfBoundsException, "Index out of bounds!");
}
return array[index];
}
/**
* Searches for an existing AP in the APSet and returns the index.
* @return the index of the AP, or -1 if not found.
*/
int find(const std::string& s) const {
for (ap_index_t i=0;
i<size();
i++) {
if (array[i]==s) {
return i;
}
}
return -1;
}
/**
* Get the size of this set
* @return the number of APs in this set.
*/
ap_index_t size() const {
return array_size;
}
/**
* Get the size of the powerset 2^APSet
* @return the size of 2^AP
*/
ap_index_t powersetSize() const {
return (1<<size());
}
/** An iterator over all the APElements in 2^APSet. */
typedef boost::counting_iterator<unsigned int> element_iterator;
/** Return iterator pointing to the first APElement. */
element_iterator all_elements_begin() const {
return element_iterator(0);
}
/** Return iterator pointing to the last APElement. */
element_iterator all_elements_end() const {
return element_iterator(1<<size());
}
/**
* Equality check.
* @param other the other APSet
* @return <b>true</b> if this and the other APSet are equal
*/
bool operator==(const APSet& other) const {
if (this->size()!=other.size()) {
return false;
}
for (unsigned int i=0;i<this->size();i++) {
if (!(this->getAP(i) == other.getAP(i))) {
return false;
}
}
return true;
}
/**
* Create a new APSet with the same number of
* atomic propositions, but named 'p0', 'p1', 'p2', ...
* The caller takes ownership of the memory of the created APSet.
* @return APSet* to newly created APSet
*/
APSet *createCanonical() const {
APSet *canonical=new APSet();
for (unsigned int i=0;
i<size();
i++) {
canonical->addAP(std::string("p")+
boost::lexical_cast<std::string>(i));
}
return canonical;
}
/** Maximum size of the APSet */
static const ap_index_t MAX_AP=31;
private:
/** Dummy constructor to prevent copying. */
APSet(APSet const& other);
/** Dummy operator= to prevent copying. */
APSet& operator=(APSet const& other);
/** The storage for the atomic propositions. */
std::string* array;
/** The size of the APSet. */
ap_index_t array_size;
};
#include <memory>
/** A reference counted pointer (std::shared_ptr) to an APSet. */
typedef std::shared_ptr<APSet> APSet_p;
/** A reference counted pointer (std::shared_ptr) to a const APSet. */
typedef std::shared_ptr<const APSet> APSet_cp;
#endif