view usr/src/cmd/man/src/util/nsgmls.src/include/Attribute.h @ 0:c9caec207d52 b86

Initial porting based on b86
author Koji Uno <koji.uno@sun.com>
date Tue, 02 Jun 2009 18:56:50 +0900
parents
children 1a15d5aaf794
line wrap: on
line source

/*
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 * Copyright 1994 James Clark
 * See the file COPYING for copying permission.
 */

#pragma ident	"@(#)Attribute.h	1.5	05/08/22 SMI"

#ifndef _ATTRIBUTE_H
#define	_ATTRIBUTE_H

#ifndef Attribute_INCLUDED
#define	Attribute_INCLUDED 1
#ifdef __GNUG__
#pragma interface
#endif

#include <stddef.h>
#include "Resource.h"
#include "Owner.h"
#include "StringC.h"
#include "Vector.h"
#include "CopyOwner.h"
#include "Boolean.h"
#include "Text.h"
#include "Ptr.h"
#include "Message.h"

#ifdef SP_NAMESPACE
namespace SP_NAMESPACE {
#endif

class Entity;
class Notation;
class DeclaredValue;
class AttributeValue;
class TokenizedAttributeValue;
class AttributeSemantics;
class AttributeContext;
class Syntax;

class SP_API AttributeValue : public Resource {
public:
	enum Type {
		implied,
		cdata,
		tokenized
	};
	AttributeValue();
	virtual ~AttributeValue();
	virtual AttributeSemantics *makeSemantics(const DeclaredValue *,
					    AttributeContext &,
					    const StringC &,
					    unsigned &,
					    unsigned &) const;
	virtual Type info(const Text *&, const StringC *&) const = 0;
	virtual const Text *text() const;
	virtual Boolean recoverUnquoted(const StringC &, const Location &,
		AttributeContext &, const StringC &);
	static Boolean handleAsUnterminated(const Text &, AttributeContext &);
};

class SP_API AttributeDefinitionDesc {
public:
	AttributeDefinitionDesc() { }
	enum DeclaredValue {
		cdata,
		name,
		number,
		nmtoken,
		nutoken,
		entity,
		idref,
		names,
		numbers,
		nmtokens,
		nutokens,
		entities,
		idrefs,
		id,
		notation,
		nameTokenGroup
	};
	DeclaredValue declaredValue;
	enum DefaultValueType {
		required,
		current,
		implied,
		conref,
		defaulted,
		fixed
	};
	DefaultValueType defaultValueType;
	ConstPtr < AttributeValue > defaultValue;
	Vector < StringC > allowedValues;
	// Attribute definitions whose default value type is current and
	// which have the same currentIndex share current values.
	size_t currentIndex;
private:
	AttributeDefinitionDesc(const AttributeDefinitionDesc &); // undefined
	void operator=(const AttributeDefinitionDesc &);	    // undefined
};

class DeclaredValue {
public:
	DeclaredValue();
	virtual ~DeclaredValue();
	// This performs syntactic checking on the value.
	virtual AttributeValue *makeValue(Text &, AttributeContext &,
				    const StringC &name,
				    unsigned &specLength) const = 0;
	// This is used to avoid unnecessary syntactic checking in the
	// case where the attribute name and vi have been omitted.
	virtual AttributeValue *makeValueFromToken(Text &,
		AttributeContext &,
		const StringC &name,
		unsigned &specLength) const;
	// This performs semantic checking on the value.
	virtual AttributeSemantics *makeSemantics(
		const TokenizedAttributeValue &,
		AttributeContext &,
		const StringC &,
		unsigned &nIdrefs,
		unsigned &nEntityNames) const;
	virtual Boolean containsToken(const StringC &) const;
	virtual Boolean tokenized() const = 0;
	virtual Boolean isNotation() const;
	virtual Boolean isEntity() const;
	virtual Boolean isId() const;
	virtual Boolean isIdref() const;
	virtual const Vector < StringC > *getTokens() const;
	virtual void buildDesc(AttributeDefinitionDesc &) const = 0;
	virtual DeclaredValue *copy() const = 0;
};

class CdataDeclaredValue : public DeclaredValue {
public:
	CdataDeclaredValue();
	Boolean tokenized() const;
	AttributeValue *makeValue(Text &, AttributeContext &, const StringC &,
			    unsigned &) const;
	void buildDesc(AttributeDefinitionDesc &) const;
	DeclaredValue *copy() const;
};

class TokenizedDeclaredValue : public DeclaredValue {
public:
	// must be in same order as AttributeDefinitionDesc
		enum TokenType {
		name,
		number,
		nameToken,
		numberToken,
		entityName
	};
	TokenizedDeclaredValue(TokenType type, Boolean isList);
	AttributeValue *makeValue(Text &, AttributeContext &, const StringC &,
			    unsigned &) const;
	TokenizedAttributeValue *makeTokenizedValue(Text &, AttributeContext &,
		const StringC &, unsigned &) const;
	Boolean tokenized() const;
	void buildDesc(AttributeDefinitionDesc &) const;
	DeclaredValue *copy() const;
private:
	TokenType type_;
	Boolean isList_;
	unsigned initialCategories_;
	unsigned subsequentCategories_;
};

class GroupDeclaredValue : public TokenizedDeclaredValue {
public:
	GroupDeclaredValue(TokenType, Vector < StringC > &);
	Boolean containsToken(const StringC &) const;
	AttributeValue *makeValue(Text &, AttributeContext &, const StringC &,
		unsigned &) const;
	AttributeValue *makeValueFromToken(Text &,
		AttributeContext &,
		const StringC &name,
		unsigned &) const;
	const Vector < StringC > *getTokens() const;
	void buildDesc(AttributeDefinitionDesc &) const;
	DeclaredValue *copy() const;
private:
	Vector < StringC > allowedValues_;
};

class NameTokenGroupDeclaredValue : public GroupDeclaredValue {
public:
	NameTokenGroupDeclaredValue(Vector < StringC > &);
	void buildDesc(AttributeDefinitionDesc &) const;
	DeclaredValue *copy() const;
};

class NotationDeclaredValue : public GroupDeclaredValue {
public:
	NotationDeclaredValue(Vector < StringC > &);
	AttributeSemantics *makeSemantics(const TokenizedAttributeValue &,
				    AttributeContext &,
				    const StringC &,
				    unsigned &nIdrefs,
				    unsigned &nEntityNames) const;
	Boolean isNotation() const;
	void buildDesc(AttributeDefinitionDesc &) const;
	DeclaredValue *copy() const;
};

class EntityDeclaredValue : public TokenizedDeclaredValue {
public:
	EntityDeclaredValue(Boolean isList);
	AttributeSemantics *makeSemantics(const TokenizedAttributeValue &,
				    AttributeContext &,
				    const StringC &,
				    unsigned &nIdrefs,
				    unsigned &nEntityNames) const;
	Boolean isEntity() const;
	DeclaredValue *copy() const;
};

class IdDeclaredValue : public TokenizedDeclaredValue {
public:
	IdDeclaredValue();
	AttributeSemantics *makeSemantics(const TokenizedAttributeValue &,
				    AttributeContext &,
				    const StringC &,
				    unsigned &nIdrefs,
				    unsigned &nEntityNames) const;
	Boolean isId() const;
	void buildDesc(AttributeDefinitionDesc &) const;
	DeclaredValue *copy() const;
};

class IdrefDeclaredValue : public TokenizedDeclaredValue {
public:
	IdrefDeclaredValue(Boolean isList);
	AttributeSemantics *makeSemantics(const TokenizedAttributeValue &,
				    AttributeContext &,
				    const StringC &,
				    unsigned &nIdrefs,
				    unsigned &nEntityNames) const;
	Boolean isIdref() const;
	void buildDesc(AttributeDefinitionDesc &) const;
	DeclaredValue *copy() const;
};

class SP_API AttributeDefinition {
public:
	AttributeDefinition(const StringC &, DeclaredValue *);
	virtual ~AttributeDefinition();
	virtual ConstPtr < AttributeValue >
		makeMissingValue(AttributeContext &) const = 0;
	virtual Boolean missingValueWouldMatch(const Text &,
		const AttributeContext &) const;
	virtual const AttributeValue *
		defaultValue(const AttributeValue *impliedValue) const;
	AttributeValue *makeValue(Text &, AttributeContext &, unsigned &) const;
	AttributeValue *makeValueFromToken(Text &,
		AttributeContext &,
		unsigned &) const;

	virtual Boolean isConref() const;
	virtual Boolean isCurrent() const;
	virtual Boolean isFixed() const;
	AttributeSemantics *makeSemantics(const AttributeValue *,
		AttributeContext &,
		unsigned &nIdrefs,
		unsigned &nEntityNames) const;
	Boolean tokenized() const;
	const StringC &name() const;
	Boolean containsToken(const StringC &) const;
	Boolean isNotation() const;
	Boolean isEntity() const;
	Boolean isId() const;
	Boolean isIdref() const;
	void getDesc(AttributeDefinitionDesc &) const;
	const Vector < StringC > *getTokens() const;
	virtual AttributeDefinition *copy() const = 0;
	void setDeclaredValue(DeclaredValue *);
private:
	virtual void buildDesc(AttributeDefinitionDesc &) const = 0;
	virtual AttributeValue *checkValue(AttributeValue *,
		AttributeContext &) const;
	StringC name_;
	CopyOwner < DeclaredValue > declaredValue_;
};

class RequiredAttributeDefinition : public AttributeDefinition {
public:
	RequiredAttributeDefinition(const StringC &, DeclaredValue *);
	ConstPtr < AttributeValue > makeMissingValue(AttributeContext &) const;
	void buildDesc(AttributeDefinitionDesc &) const;
	AttributeDefinition *copy() const;
};

class CurrentAttributeDefinition : public AttributeDefinition {
public:
	CurrentAttributeDefinition(const StringC &, DeclaredValue *,
		size_t index);
	ConstPtr < AttributeValue > makeMissingValue(AttributeContext &) const;
	Boolean missingValueWouldMatch(const Text &,
		const AttributeContext &) const;
	AttributeValue *checkValue(AttributeValue *, AttributeContext &) const;
	void buildDesc(AttributeDefinitionDesc &) const;
	Boolean isCurrent() const;
	AttributeDefinition *copy() const;
private:
	size_t currentIndex_;
};

class ImpliedAttributeDefinition : public AttributeDefinition {
public:
	ImpliedAttributeDefinition(const StringC &, DeclaredValue *);
	ConstPtr < AttributeValue > makeMissingValue(AttributeContext &) const;
	const AttributeValue *defaultValue(const AttributeValue *) const;
	void buildDesc(AttributeDefinitionDesc &) const;
	AttributeDefinition *copy() const;
};

class ConrefAttributeDefinition : public ImpliedAttributeDefinition {
public:
	ConrefAttributeDefinition(const StringC &, DeclaredValue *);
	Boolean isConref() const;
	void buildDesc(AttributeDefinitionDesc &) const;
	AttributeDefinition *copy() const;
};

class DefaultAttributeDefinition : public AttributeDefinition {
public:
	DefaultAttributeDefinition(const StringC &, DeclaredValue *,
		AttributeValue *);
	ConstPtr < AttributeValue > makeMissingValue(AttributeContext &) const;
	Boolean missingValueWouldMatch(const Text &,
		const AttributeContext &) const;
	void buildDesc(AttributeDefinitionDesc &) const;
	AttributeDefinition *copy() const;
	const AttributeValue *defaultValue(const AttributeValue *) const;
private:
	ConstPtr < AttributeValue > value_;
};

class FixedAttributeDefinition : public DefaultAttributeDefinition {
public:
	FixedAttributeDefinition(const StringC &, DeclaredValue *,
		AttributeValue *);
	// check that it's equal to the default
	AttributeValue *checkValue(AttributeValue *, AttributeContext &) const;
	void buildDesc(AttributeDefinitionDesc &) const;
	Boolean isFixed() const;
	AttributeDefinition *copy() const;
};

class SP_API AttributeDefinitionList : public Resource {
public:
	AttributeDefinitionList(Vector < CopyOwner < AttributeDefinition > > &,
		size_t listIndex,
		Boolean anyCurrent = 0,
		size_t idIndex = size_t(-1),
		size_t notationIndex = size_t(-1));
	AttributeDefinitionList(const ConstPtr < AttributeDefinitionList > &);
	size_t size() const;
	AttributeDefinition *def(size_t);
	const AttributeDefinition *def(size_t)const;
	Boolean tokenIndex(const StringC &, unsigned &) const;
	Boolean tokenIndexUnique(const StringC &, unsigned) const;
	Boolean attributeIndex(const StringC &, unsigned &) const;
	size_t index() const;
	size_t idIndex() const;
	size_t notationIndex() const;
	Boolean anyCurrent() const;
	void setIndex(size_t);
	void append(AttributeDefinition *);
private:
	Vector < CopyOwner < AttributeDefinition > > defs_;
	size_t index_;
	size_t idIndex_;		// -1 if no ID attribute
	size_t notationIndex_;	// -1 if no notation attribute
	Boolean anyCurrent_;
	ConstPtr < AttributeDefinitionList > prev_;
};

class AttributeSemantics {
public:
	AttributeSemantics();
	virtual ~AttributeSemantics();
	virtual size_t nEntities() const;
	virtual ConstPtr < Entity > entity(size_t)const;
	virtual ConstPtr < Notation > notation() const;
	virtual AttributeSemantics *copy() const = 0;
};

class EntityAttributeSemantics  : public AttributeSemantics {
public:
	EntityAttributeSemantics(Vector < ConstPtr < Entity > > &);
	size_t nEntities() const;
	ConstPtr < Entity > entity(size_t)const;
	AttributeSemantics *copy() const;
private:
	Vector < ConstPtr < Entity > > entity_;
};

class NotationAttributeSemantics : public AttributeSemantics {
public:
	NotationAttributeSemantics(const ConstPtr < Notation > &);
	ConstPtr < Notation > notation() const;
	AttributeSemantics *copy() const;
private:
	ConstPtr < Notation > notation_;
};

class SP_API ImpliedAttributeValue : public AttributeValue {
public:
	ImpliedAttributeValue();
	Type info(const Text *&, const StringC *&) const;
};

class CdataAttributeValue : public AttributeValue {
public:
	CdataAttributeValue(Text &);
	Type info(const Text *&, const StringC *&) const;
	const Text *text() const;
	Boolean recoverUnquoted(const StringC &, const Location &,
		AttributeContext &, const StringC &);
private:
	Text text_;
};

class TokenizedAttributeValue : public AttributeValue {
public:
	TokenizedAttributeValue(Text &, const Vector < size_t > &);
	size_t nTokens() const;
	AttributeSemantics *makeSemantics(const DeclaredValue *,
		AttributeContext &,
		const StringC &,
		unsigned &,
		unsigned &) const;
	Type info(const Text *&, const StringC *&) const;
	const Text *text() const;
	const StringC &string() const;
	StringC token(size_t)const;
	void token(size_t, const Char *&, size_t &) const;
	Location tokenLocation(size_t)const;
	Boolean tokenLocation(size_t,
		const ConstPtr < Origin > *&, Index &) const;
	Boolean recoverUnquoted(const StringC &, const Location &,
		AttributeContext &, const StringC &);
private:
	TokenizedAttributeValue(const TokenizedAttributeValue &); // undefined
	void operator=(const TokenizedAttributeValue &);	    // undefined
	Text text_;
	// index into value of each space
	// length is number of tokens - 1
	Vector < size_t > spaceIndex_;
};

class SP_API Attribute {
public:
	Attribute();
	Boolean specified() const;
	size_t specIndex() const;
	const AttributeValue *value() const;
	const ConstPtr < AttributeValue > &valuePointer() const;
	const AttributeSemantics *semantics() const;
	void setSpec(size_t);
	void setValue(const ConstPtr < AttributeValue > &);
	void setSemantics(AttributeSemantics *);
	void clear();
private:
	size_t specIndexPlus_;
	ConstPtr < AttributeValue > value_;
	CopyOwner < AttributeSemantics > semantics_;
};

class SP_API AttributeList  {
public:
	AttributeList();
	AttributeList(const ConstPtr < AttributeDefinitionList > &);
	void init(const ConstPtr < AttributeDefinitionList > &);
	// was a conref attribute specified?
	Boolean conref()const;
	size_t size()const;
	const StringC &name(unsigned)const;
	const AttributeValue *value(unsigned)const;
	size_t specIndex(size_t)const;
	const ConstPtr < AttributeValue > &valuePointer(unsigned)const;
	const AttributeSemantics *semantics(unsigned)const;
	Boolean tokenized(unsigned index) const;
	Boolean tokenIndex(const StringC &, unsigned &) const;
	Boolean tokenIndexUnique(const StringC &, unsigned) const;
	Boolean attributeIndex(const StringC &, unsigned &) const;
	void finish(AttributeContext &);
	Boolean setValue(unsigned index, Text &, AttributeContext &,
		unsigned &specLength);
	void setValueToken(unsigned index, Text &, AttributeContext &,
		unsigned &specLength);
	void setSpec(unsigned index, AttributeContext &);
	Boolean recoverUnquoted(const StringC &, const Location &,
		AttributeContext &);
	Boolean handleAsUnterminated(AttributeContext &context);
	void swap(AttributeList &);
	size_t nSpec() const;
	size_t defIndex() const;
	// is the attribute #current
	Boolean current(unsigned)const;
	Boolean anyCurrent()const;
	Boolean specified(unsigned)const;
	Boolean id(unsigned)const;
	Boolean idref(unsigned)const;
	const Vector < StringC > *getAllowedTokens(unsigned)const;
	const StringC *getId() const;	// null if none
	Boolean idIndex(unsigned &) const;
	void noteInvalidSpec();
	void changeDef(const ConstPtr < AttributeDefinitionList > &);
	const ConstPtr < AttributeDefinitionList > &def() const;
private:
	const AttributeDefinition *def(size_t)const;
	PackedBoolean conref_;
	unsigned nIdrefs_;
	unsigned nEntityNames_;
	size_t nSpec_;
	Vector < Attribute > vec_;
	ConstPtr < AttributeDefinitionList > def_;
};

class SP_API AttributeContext : public Messenger {
public:
	AttributeContext();
	virtual ~AttributeContext();
	virtual Boolean defineId(const StringC &, const Location &, Location &);
	virtual void noteIdref(const StringC &, const Location &);
	virtual void noteCurrentAttribute(size_t, AttributeValue *);
	virtual ConstPtr < AttributeValue > getCurrentAttribute(size_t)const;
	virtual ConstPtr < Entity > getAttributeEntity(const StringC &,
		const Location &);
	virtual ConstPtr < Notation > getAttributeNotation(const StringC &,
		const Location &);
	virtual const Syntax &attributeSyntax() const = 0;

	ConstPtr < AttributeValue > makeImpliedAttributeValue();
	Boolean mayDefaultAttribute() const;
	Boolean validate() const;
protected:
	Boolean mayDefaultAttribute_;
	Boolean validate_;
private:
	ConstPtr < AttributeValue > impliedAttributeValue_;
};

inline
Boolean AttributeDefinition::tokenized() const
{
	return (declaredValue_->tokenized());
}

inline
Boolean AttributeDefinition::isNotation() const
{
	return (declaredValue_->isNotation());
}

inline
Boolean AttributeDefinition::isEntity() const
{
	return (declaredValue_->isEntity());
}

inline
Boolean AttributeDefinition::isId() const
{
	return (declaredValue_->isId());
}

inline
Boolean AttributeDefinition::isIdref() const
{
	return (declaredValue_->isIdref());
}

inline
const Vector < StringC > *AttributeDefinition::getTokens() const
{
	return (declaredValue_->getTokens());
}

inline
AttributeSemantics *
AttributeDefinition::makeSemantics(const AttributeValue *value,
	AttributeContext &context, unsigned &nIdrefs,
	unsigned &nEntityNames) const
{
	return (value->makeSemantics(declaredValue_.pointer(),
		context, name_, nIdrefs, nEntityNames));
}

inline
AttributeValue *AttributeDefinition::makeValue(Text &text,
	AttributeContext &context, unsigned &specLength) const
{
	return (checkValue(declaredValue_->makeValue(text,
		context, name_, specLength), context));
}

inline
AttributeValue *
AttributeDefinition::makeValueFromToken(Text &text,
					AttributeContext &context,
					unsigned &specLength) const
{
	return (checkValue(declaredValue_->makeValueFromToken(text,
		context, name_, specLength), context));
}

inline
Boolean AttributeDefinition::containsToken(const StringC &token) const
{
	return (declaredValue_->containsToken(token));
}

inline
const StringC &AttributeDefinition::name() const
{
	return (name_);
}

inline
void AttributeDefinition::setDeclaredValue(DeclaredValue *declaredValue)
{
	declaredValue_ = declaredValue;
}

inline
size_t AttributeDefinitionList::size() const
{
	return (defs_.size());
}

inline
size_t AttributeDefinitionList::index() const
{
	return (index_);
}

inline
void AttributeDefinitionList::setIndex(size_t index)
{
	index_ = index;
}

inline
size_t AttributeDefinitionList::idIndex() const
{
	return (idIndex_);
}

inline
size_t AttributeDefinitionList::notationIndex() const
{
	return (notationIndex_);
}

inline
Boolean AttributeDefinitionList::anyCurrent() const
{
	return (anyCurrent_);
}

inline
AttributeDefinition *AttributeDefinitionList::def(size_t i)
{
	return (defs_[i].pointer());
}

inline
const AttributeDefinition *AttributeDefinitionList::def(size_t i) const
{
	return (defs_[i].pointer());
}

inline
size_t TokenizedAttributeValue::nTokens() const
{
	return (spaceIndex_.size() + 1);
}

inline
const StringC &TokenizedAttributeValue::string() const
{
	return (text_.string());
}

inline
void TokenizedAttributeValue::token(size_t i,
				    const Char *&ptr, size_t &len) const
{
	size_t startIndex = i == 0 ? 0 :
		spaceIndex_[i - 1] + 1;
	ptr = text_.string().data() + startIndex;
	len = (i == spaceIndex_.size() ? text_.size() :
		spaceIndex_[i]) - startIndex;
}

inline
StringC TokenizedAttributeValue::token(size_t i) const
{
	const Char *ptr;
	size_t len;
	token(i, ptr, len);
	return (StringC(ptr, len));
}


inline
Location TokenizedAttributeValue::tokenLocation(size_t i) const
{
	return (text_.charLocation(i == 0 ? 0 :
		spaceIndex_[i - 1] + 1));
}

inline
Boolean TokenizedAttributeValue::tokenLocation(size_t i,
	const ConstPtr < Origin > *&origin, Index &index) const
{
	return (text_.charLocation(i == 0 ? 0 :
		spaceIndex_[i - 1] + 1, origin, index));
}

inline
size_t Attribute::specIndex() const
{
	return (specIndexPlus_ - 1);
}

inline
Boolean Attribute::specified() const
{
	return (specIndexPlus_ != 0);
}

inline
const AttributeValue *Attribute::value() const
{
	return (value_.pointer());
}

inline
const ConstPtr < AttributeValue > &Attribute::valuePointer() const
{
	return (value_);
}

inline
const AttributeSemantics *Attribute::semantics() const
{
	return (semantics_.pointer());
}

inline
void Attribute::setSpec(size_t index)
{
	specIndexPlus_ = index + 1;
}

inline
void Attribute::setValue(const ConstPtr < AttributeValue > &value)
{
	value_ = value;
}

inline
void Attribute::setSemantics(AttributeSemantics *semantics)
{
	semantics_ = semantics;
}

inline
size_t AttributeList::size() const
{
	return (vec_.size());
}

inline
const AttributeDefinition *AttributeList::def(size_t i) const
{
	return (def_->def(i));
}

inline
const ConstPtr < AttributeDefinitionList > &AttributeList::def() const
{
	return (def_);
}

inline
Boolean AttributeList::tokenized(unsigned i) const
{
	return (def(i)->tokenized());
}

inline
Boolean AttributeList::tokenIndex(const StringC &name, unsigned &index) const
{
	return (!def_.isNull() && def_->tokenIndex(name, index));
}

inline
Boolean AttributeList::tokenIndexUnique(const StringC &name,
	unsigned index) const
{
	return (def_->tokenIndexUnique(name, index));
}

inline
Boolean AttributeList::attributeIndex(const StringC &name,
	unsigned &index) const
{
	return (!def_.isNull() && def_->attributeIndex(name, index));
}

inline
const StringC &AttributeList::name(unsigned i) const
{
	return (def(i)->name());
}

inline
const Vector < StringC > *AttributeList::getAllowedTokens(unsigned i)
	const
{
	return (def(i)->getTokens());
}

inline
const AttributeValue *AttributeList::value(unsigned i) const
{
	return (vec_[i].value());
}

inline
const ConstPtr < AttributeValue > &AttributeList::valuePointer(unsigned i)
	const
{
	return (vec_[i].valuePointer());
}

inline
const AttributeSemantics *AttributeList::semantics(unsigned i) const
{
	return (vec_[i].semantics());
}

inline
size_t AttributeList::specIndex(size_t i) const
{
	return (vec_[i].specIndex());
}

inline
size_t AttributeList::nSpec() const
{
	return (nSpec_);
}

inline
Boolean AttributeList::conref() const
{
	return (conref_);
}

inline
size_t AttributeList::defIndex() const
{
	return (def_.isNull() ? size_t(-1) : def_->index());
}

inline
Boolean AttributeList::current(unsigned i) const
{
	return (def(i)->isCurrent());
}

inline
Boolean AttributeList::anyCurrent() const
{
	return (!def_.isNull() && def_->anyCurrent());
}

inline
const AttributeValue *
DefaultAttributeDefinition::defaultValue(const AttributeValue *)
	const
{
	return (value_.pointer());
}

inline
Boolean AttributeList::idIndex(unsigned &ind) const
{
	if (def_.isNull() || def_->idIndex() == size_t(-1))
		return (0);
	else {
		ind = def_->idIndex();
		return (1);
	}
}

inline
Boolean AttributeList::id(unsigned i) const
{
	return (def(i)->isId());
}

inline
Boolean AttributeList::idref(unsigned i) const
{
	return (def(i)->isIdref());
}

inline
Boolean AttributeList::specified(unsigned i) const
{
	return (vec_[i].specified());
}

inline
Boolean AttributeContext::mayDefaultAttribute() const
{
	return (mayDefaultAttribute_);
}

inline
Boolean AttributeContext::validate() const
{
	return (validate_);
}

#ifdef SP_NAMESPACE
}
#endif

#endif /* not Attribute_INCLUDED */

#endif /* _ATTRIBUTE_H */