Blame lib/Group.h

Packit 8a864e
// Copyright (c) 1994 James Clark
Packit 8a864e
// See the file COPYING for copying permission.
Packit 8a864e
Packit 8a864e
#ifndef Group_INCLUDED
Packit 8a864e
#define Group_INCLUDED 1
Packit 8a864e
#ifdef __GNUG__
Packit 8a864e
#pragma interface
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
#include "Boolean.h"
Packit 8a864e
#include "ContentToken.h"
Packit 8a864e
#include "StringC.h"
Packit 8a864e
#include "MessageArg.h"
Packit 8a864e
#include "Owner.h"
Packit 8a864e
#include "Syntax.h"
Packit 8a864e
#include "Text.h"
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
namespace SP_NAMESPACE {
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
class GroupToken {
Packit 8a864e
public:
Packit 8a864e
  GroupToken() { }
Packit 8a864e
  enum Type {
Packit 8a864e
    invalid,
Packit 8a864e
    nameToken,
Packit 8a864e
    name,
Packit 8a864e
    dataTagLiteral,		// data tag (padding) template
Packit 8a864e
    dataTagGroup,
Packit 8a864e
    elementToken,
Packit 8a864e
    modelGroup,
Packit 8a864e
    pcdata,
Packit 8a864e
    dataTagTemplateGroup,
Packit 8a864e
    all,
Packit 8a864e
    implicit
Packit 8a864e
    };
Packit 8a864e
  Type type;
Packit 8a864e
  StringC token;		// name nameToken; with substitution
Packit 8a864e
  Owner<ModelGroup> model;
Packit 8a864e
  Owner<ContentToken> contentToken; // elementToken pcdata dataTagGroup
Packit 8a864e
  Text text;
Packit 8a864e
  Vector<Text> textVector;
Packit 8a864e
private:
Packit 8a864e
  GroupToken(const GroupToken &); // undefined
Packit 8a864e
  void operator=(const GroupToken &); // undefined
Packit 8a864e
};
Packit 8a864e
Packit 8a864e
class AllowedGroupTokens {
Packit 8a864e
public:
Packit 8a864e
  AllowedGroupTokens(GroupToken::Type,
Packit 8a864e
		     GroupToken::Type = GroupToken::invalid,
Packit 8a864e
		     GroupToken::Type = GroupToken::invalid,
Packit 8a864e
		     GroupToken::Type = GroupToken::invalid,
Packit 8a864e
		     GroupToken::Type = GroupToken::invalid,
Packit 8a864e
		     GroupToken::Type = GroupToken::invalid);
Packit 8a864e
  Boolean groupToken(GroupToken::Type) const;
Packit 8a864e
  // modelGroup, dataTagTemplateGroup
Packit 8a864e
  GroupToken::Type group() const;
Packit 8a864e
  GroupToken::Type nameStart() const;
Packit 8a864e
private:
Packit 8a864e
  void allow(GroupToken::Type);
Packit 8a864e
  unsigned flags_;
Packit 8a864e
};
Packit 8a864e
Packit 8a864e
struct GroupConnector {
Packit 8a864e
  enum Type {
Packit 8a864e
    andGC,
Packit 8a864e
    orGC,
Packit 8a864e
    seqGC,
Packit 8a864e
    grpcGC,
Packit 8a864e
    dtgcGC
Packit 8a864e
  };
Packit 8a864e
  Type type;
Packit 8a864e
};
Packit 8a864e
Packit 8a864e
class AllowedGroupConnectors {
Packit 8a864e
public:
Packit 8a864e
  AllowedGroupConnectors(GroupConnector::Type);
Packit 8a864e
  AllowedGroupConnectors(GroupConnector::Type, GroupConnector::Type);
Packit 8a864e
  AllowedGroupConnectors(GroupConnector::Type, GroupConnector::Type,
Packit 8a864e
			 GroupConnector::Type);
Packit 8a864e
  AllowedGroupConnectors(GroupConnector::Type, GroupConnector::Type,
Packit 8a864e
			 GroupConnector::Type, GroupConnector::Type);
Packit 8a864e
  Boolean groupConnector(GroupConnector::Type) const;
Packit 8a864e
private:
Packit 8a864e
  void allow(GroupConnector::Type);
Packit 8a864e
  unsigned flags_;
Packit 8a864e
};
Packit 8a864e
Packit 8a864e
class AllowedGroupTokensMessageArg : public MessageArg {
Packit 8a864e
public:
Packit 8a864e
  AllowedGroupTokensMessageArg(const AllowedGroupTokens &allow,
Packit 8a864e
			       const ConstPtr<Syntax> &syntax);
Packit 8a864e
  MessageArg *copy() const;
Packit 8a864e
  void append(MessageBuilder &) const;
Packit 8a864e
private:
Packit 8a864e
  AllowedGroupTokens allow_;
Packit 8a864e
  ConstPtr<Syntax> syntax_;
Packit 8a864e
};
Packit 8a864e
Packit 8a864e
class AllowedGroupConnectorsMessageArg : public MessageArg {
Packit 8a864e
public:
Packit 8a864e
  AllowedGroupConnectorsMessageArg(const AllowedGroupConnectors &allow,
Packit 8a864e
				   const ConstPtr<Syntax> &syntax);
Packit 8a864e
  MessageArg *copy() const;
Packit 8a864e
  void append(MessageBuilder &) const;
Packit 8a864e
private:
Packit 8a864e
  AllowedGroupConnectors allow_;
Packit 8a864e
  ConstPtr<Syntax> syntax_;
Packit 8a864e
};
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
Boolean AllowedGroupTokens::groupToken(GroupToken::Type i) const
Packit 8a864e
{
Packit 8a864e
  return ((1 << i) & flags_) != 0;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
GroupToken::Type AllowedGroupTokens::group() const
Packit 8a864e
{
Packit 8a864e
  if (groupToken(GroupToken::modelGroup))
Packit 8a864e
    return GroupToken::modelGroup;
Packit 8a864e
  else if (groupToken(GroupToken::dataTagTemplateGroup))
Packit 8a864e
    return GroupToken::dataTagTemplateGroup;
Packit 8a864e
  else
Packit 8a864e
    return GroupToken::invalid;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
GroupToken::Type AllowedGroupTokens::nameStart() const
Packit 8a864e
{
Packit 8a864e
  if (groupToken(GroupToken::elementToken))
Packit 8a864e
    return GroupToken::elementToken;
Packit 8a864e
  else if (groupToken(GroupToken::nameToken))
Packit 8a864e
    return GroupToken::nameToken;
Packit 8a864e
  else if (groupToken(GroupToken::name))
Packit 8a864e
    return GroupToken::name;
Packit 8a864e
  else
Packit 8a864e
    return GroupToken::invalid;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
void AllowedGroupTokens::allow(GroupToken::Type t)
Packit 8a864e
{
Packit 8a864e
  flags_ |= (1 << t);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
Boolean AllowedGroupConnectors::groupConnector(GroupConnector::Type c) const
Packit 8a864e
{
Packit 8a864e
  return (flags_ & (1 << c)) != 0;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
void AllowedGroupConnectors::allow(GroupConnector::Type c)
Packit 8a864e
{
Packit 8a864e
  flags_ |= (1 << c);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
}
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
#endif /* not Group_INCLUDED */