⛏️ index : haiku.git

/*
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef TYPE_H
#define TYPE_H


#include <image.h>

#include <Referenceable.h>
#include <Variant.h>

#include "Types.h"


enum type_kind {
	TYPE_PRIMITIVE,
	TYPE_COMPOUND,
	TYPE_MODIFIED,
	TYPE_TYPEDEF,
	TYPE_ADDRESS,
	TYPE_ENUMERATION,
	TYPE_SUBRANGE,
	TYPE_ARRAY,
	TYPE_UNSPECIFIED,
	TYPE_FUNCTION,
	TYPE_POINTER_TO_MEMBER
};


enum compound_type_kind {
	COMPOUND_TYPE_CLASS,
	COMPOUND_TYPE_STRUCT,
	COMPOUND_TYPE_UNION,
	COMPOUND_TYPE_INTERFACE
};


enum address_type_kind {
	DERIVED_TYPE_POINTER,
	DERIVED_TYPE_REFERENCE
};


enum template_type_kind {
	TEMPLATE_TYPE_TYPE,
	TEMPLATE_TYPE_VALUE
};


enum {
	TYPE_MODIFIER_CONST		= 0x01,
	TYPE_MODIFIER_VOLATILE	= 0x02,
	TYPE_MODIFIER_RESTRICT	= 0x04,
	TYPE_MODIFIER_PACKED	= 0x08,
	TYPE_MODIFIER_SHARED	= 0x10
};


class AddressType;
class ArrayIndexPath;
class ArrayType;
class BString;
class Type;
class ValueLocation;


class BaseType : public BReferenceable {
public:
	virtual						~BaseType();

	virtual	Type*				GetType() const = 0;
};


class DataMember : public BReferenceable {
public:
	virtual						~DataMember();

	virtual	const char*			Name() const = 0;
	virtual	Type*				GetType() const = 0;
};


class EnumeratorValue : public BReferenceable {
public:
	virtual						~EnumeratorValue();

	virtual	const char*			Name() const = 0;
	virtual	BVariant			Value() const = 0;
};


class ArrayDimension : public BReferenceable {
public:
	virtual						~ArrayDimension();

	virtual	Type*				GetType() const = 0;
									// subrange or enumeration
	virtual	uint64				CountElements() const;
									// returns 0, if unknown
};


class FunctionParameter : public BReferenceable {
public:
	virtual						~FunctionParameter();

	virtual	const char*			Name() const = 0;
	virtual	Type*				GetType() const = 0;
};


class TemplateParameter : public BReferenceable {
public:
	virtual						~TemplateParameter();

	virtual	template_type_kind	Kind() const = 0;
	virtual Type*				GetType() const = 0;
	virtual	BVariant			Value() const = 0;
};


class Type : public BReferenceable {
public:
	virtual						~Type();

	virtual	image_id			ImageID() const = 0;
	virtual	const BString&		ID() const = 0;
	virtual	const BString&		Name() const = 0;
	virtual	type_kind			Kind() const = 0;
	virtual	target_size_t		ByteSize() const = 0;
	virtual	Type*				ResolveRawType(bool nextOneOnly) const;
									// strips modifiers and typedefs (only one,
									// if requested)


	virtual status_t			CreateDerivedAddressType(
									address_type_kind kind,
									AddressType*& _resultType);

	virtual	status_t			CreateDerivedArrayType(
									int64 lowerBound,
									int64 elementCount,
									bool extendExisting,
										// if the current object is already
										// an array type, attach an extra
										// dimension to it rather than
										// creating a new encapsulating
										// type object
									ArrayType*& _resultType);


	virtual	status_t			ResolveObjectDataLocation(
									const ValueLocation& objectLocation,
									ValueLocation*& _location) = 0;
									// returns a reference
	virtual	status_t			ResolveObjectDataLocation(
									target_addr_t objectAddress,
									ValueLocation*& _location) = 0;
									// returns a reference
};


class PrimitiveType : public virtual Type {
public:
	virtual						~PrimitiveType();

	virtual	type_kind			Kind() const;

	virtual	uint32				TypeConstant() const = 0;
};


class CompoundType : public virtual Type {
public:
	virtual						~CompoundType();

	virtual	type_kind			Kind() const;
	virtual compound_type_kind	CompoundKind() const = 0;

	virtual	int32				CountBaseTypes() const = 0;
	virtual	BaseType*			BaseTypeAt(int32 index) const = 0;

	virtual	int32				CountDataMembers() const = 0;
	virtual	DataMember*			DataMemberAt(int32 index) const = 0;

	virtual int32				CountTemplateParameters() const = 0;
	virtual TemplateParameter*	TemplateParameterAt(int32 index) const = 0;


	virtual	status_t			ResolveBaseTypeLocation(BaseType* baseType,
									const ValueLocation& parentLocation,
									ValueLocation*& _location) = 0;
									// returns a reference
	virtual	status_t			ResolveDataMemberLocation(DataMember* member,
									const ValueLocation& parentLocation,
									ValueLocation*& _location) = 0;
									// returns a reference
};


class ModifiedType : public virtual Type {
public:
	virtual						~ModifiedType();

	virtual	type_kind			Kind() const;

	virtual	uint32				Modifiers() const = 0;
	virtual	Type*				BaseType() const = 0;
	virtual	Type*				ResolveRawType(bool nextOneOnly) const;
};


class TypedefType : public virtual Type {
public:
	virtual						~TypedefType();

	virtual	type_kind			Kind() const;

	virtual	Type*				BaseType() const = 0;
	virtual	Type*				ResolveRawType(bool nextOneOnly) const;
};


class AddressType : public virtual Type {
public:
	virtual						~AddressType();

	virtual	type_kind			Kind() const;

	virtual	address_type_kind	AddressKind() const = 0;
	virtual	Type*				BaseType() const = 0;
};


class EnumerationType : public virtual Type {
public:
	virtual						~EnumerationType();

	virtual	type_kind			Kind() const;

	virtual	Type*				BaseType() const = 0;
									// may return NULL

	virtual	int32				CountValues() const = 0;
	virtual	EnumeratorValue*	ValueAt(int32 index) const = 0;
	virtual	EnumeratorValue*	ValueFor(const BVariant& value) const;
};


class SubrangeType : public virtual Type {
public:
	virtual						~SubrangeType();

	virtual	type_kind			Kind() const;

	virtual	Type*				BaseType() const = 0;

	virtual	BVariant			LowerBound() const = 0;
	virtual	BVariant			UpperBound() const = 0;
};


class ArrayType : public virtual Type {
public:
	virtual						~ArrayType();

	virtual	type_kind			Kind() const;

	virtual	Type*				BaseType() const = 0;

	virtual	int32				CountDimensions() const = 0;
	virtual	ArrayDimension*		DimensionAt(int32 index) const = 0;

	virtual	status_t			ResolveElementLocation(
									const ArrayIndexPath& indexPath,
									const ValueLocation& parentLocation,
									ValueLocation*& _location) = 0;
									// returns a reference
};


class UnspecifiedType : public virtual Type {
public:
	virtual						~UnspecifiedType();

	virtual	type_kind			Kind() const;
};


class FunctionType : public virtual Type {
public:
	virtual						~FunctionType();

	virtual	type_kind			Kind() const;

	virtual	Type*				ReturnType() const = 0;

	virtual	int32				CountParameters() const = 0;
	virtual	FunctionParameter*	ParameterAt(int32 index) const = 0;

	virtual	bool				HasVariableArguments() const = 0;
};


class PointerToMemberType : public virtual Type {
public:
	virtual						~PointerToMemberType();

	virtual	type_kind			Kind() const;

	virtual	CompoundType*		ContainingType() const = 0;
	virtual	Type*				BaseType() const = 0;
};


#endif	// TYPE_H