blob: 8fd20b7ee3f3d2ef7a9bdd873afc00cb1aceac74 [file] [log] [blame]
/*
* Created by Phil on 2/12/2013.
* Copyright 2013 Two Blue Cubes Ltd. All rights reserved.
*
* Distributed under the Boost Software License, Version 1.0. (See accompanying
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
*/
#ifndef TWOBLUECUBES_CATCH_TAGS_H_INCLUDED
#define TWOBLUECUBES_CATCH_TAGS_H_INCLUDED
#include "catch_common.h"
#include <string>
#include <set>
#include <map>
#include <vector>
#ifdef __clang__
#pragma clang diagnostic ignored "-Wpadded"
#endif
namespace Catch {
class TagParser {
public:
virtual ~TagParser();
void parse( std::string const& str );
protected:
virtual void acceptTag( std::string const& tag ) = 0;
virtual void acceptChar( char c ) = 0;
virtual void endParse() {}
private:
};
class TagExtracter : public TagParser {
public:
TagExtracter( std::set<std::string>& tags );
virtual ~TagExtracter();
void parse( std::string& description );
private:
virtual void acceptTag( std::string const& tag );
virtual void acceptChar( char c );
TagExtracter& operator=(TagExtracter const&);
std::set<std::string>& m_tags;
std::string m_remainder;
};
class Tag {
public:
Tag();
Tag( std::string const& name, bool isNegated );
std::string getName() const;
bool isNegated() const;
bool operator ! () const;
private:
std::string m_name;
bool m_isNegated;
};
class TagSet {
typedef std::map<std::string, Tag> TagMap;
public:
void add( Tag const& tag );
bool empty() const;
bool matches( std::set<std::string> const& tags ) const;
private:
TagMap m_tags;
};
class TagExpression {
public:
bool matches( std::set<std::string> const& tags ) const;
private:
friend class TagExpressionParser;
std::vector<TagSet> m_tagSets;
};
class TagExpressionParser : public TagParser {
public:
TagExpressionParser( TagExpression& exp );
~TagExpressionParser();
private:
virtual void acceptTag( std::string const& tag );
virtual void acceptChar( char c );
virtual void endParse();
TagExpressionParser& operator=(TagExpressionParser const&);
bool m_isNegated;
TagSet m_currentTagSet;
TagExpression& m_exp;
};
} // end namespace Catch
#endif // TWOBLUECUBES_CATCH_TAGS_HPP_INCLUDED