blob: 6498ec379f2ebca2d613f8d3e53be959b97e014e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.debug.core.model;
/**
* A byte of memory in a memory block. Each byte of memory has a value and
* attributes indicating if the byte is read-only, valid, or if its value has
* changed.
* <p>
* Clients may instantiate this class. Clients may subclass this class to
* add other attributes to a memory byte, as required.
* </p>
* @since 3.1
* @see org.eclipse.debug.core.model.IMemoryBlockExtension
*/
public class MemoryByte {
/**
* Bit mask used to indicate a byte is writable.
*/
public static final byte WRITABLE = 0x01;
/**
* Bit mask used to indicate a byte is readable.
* A memory byte is readable when its value and attributes are retrievable.
* Otherwise, a byte is considered non-readable.
*/
public static final byte READABLE = 0x02;
/**
* Bit mask used to indicate a byte has changed since the last
* suspend event.
*
* @see org.eclipse.debug.core.DebugEvent#SUSPEND
*/
public static final byte CHANGED = 0x04;
/**
* Bit mask used to indicate a memory byte has history to
* determine if its value has changed. When a memory byte's
* history is unknown, the change state has no meaning.
*/
public static final byte HISTORY_KNOWN = 0x08;
/**
* Bit mask used to indicate a this byte of memory
* is big endian. If this byte of memory is little endian,
* turn this bit mask to off.
*/
public static final byte BIG_ENDIAN = 0x10;
/**
* Bit mask used to indicate that the endianess of this byte
* of memory is known. When a memory byte's endianess is
* unknown, the endianess of this byte has no meaning.
*/
public static final byte ENDIANESS_KNOWN = 0x20;
/**
* Value of this byte.
*/
protected byte value;
/**
* Attribute flags.
* <p>
* To specify READABLE: flags |= MemoryByte.READABLE;
* To specify WRITABLE: flags |= MemoryByte.WRITABLE;
* </p>
*/
protected byte flags;
/**
* Constructs a readable, writable memory byte without a change history,
* and a value of 0. The byte's endianess is known and is little endian
* by default.
*/
public MemoryByte() {
this((byte)0, (byte)(WRITABLE | READABLE | ENDIANESS_KNOWN));
}
/**
* Constructs a readable, writable memory byte without a change history,
* with the given value. The byte's endianess is known and is little endian
* by default.
*
* @param byteValue value of this memory byte
*
*/
public MemoryByte(byte byteValue) {
this(byteValue, (byte)(WRITABLE | READABLE | ENDIANESS_KNOWN));
}
/**
* Constructs a memory byte with the given value and attributes.
*
* @param byteValue value of this memory byte
* @param byteFlags attributes of the byte specified as a bit mask
*/
public MemoryByte(byte byteValue, byte byteFlags) {
value = byteValue;
flags = byteFlags;
}
/**
* Returns this memory byte's attribute as a bit mask.
*
* @return this memory byte's attribute as a bit mask
*/
public byte getFlags() {
return flags;
}
/**
* Sets this memory byte's attributes based on the given bit mask.
*
* @param flags bit mask of attributes
*/
public void setFlags(byte flags) {
this.flags = flags;
}
/**
* Returns the value of this memory byte.
*
* @return the value of this memory byte
*/
public byte getValue() {
return value;
}
/**
* Sets the value of this memory byte.
*
* @param value the new value of this memory byte
*/
public void setValue(byte value) {
this.value = value;
}
/**
* Sets whether this memory byte is readable. A memory byte
* is considered readable when its value and attributes are
* retrievable.
*
* @param readable whether this memory byte is readable
*/
public void setReadable(boolean readable) {
flags |= MemoryByte.READABLE;
if (!readable)
flags ^= MemoryByte.READABLE;
}
/**
* Returns whether this memory byte is readable. A memory byte
* is considered readable when its value and attributes are
* retrievable.
*
* @return whether this memory byte is readable
*/
public boolean isReadable() {
return ((flags & MemoryByte.READABLE) == MemoryByte.READABLE);
}
/**
* Sets whether this memory byte is writable.
*
* @param writable whether this memory byte is writable.
*/
public void setWritable(boolean writable) {
flags |= MemoryByte.WRITABLE;
if (!writable)
flags ^= MemoryByte.WRITABLE;
}
/**
* Returns whether this memory byte is writable.
*
* @return whether this memory byte is writable
*/
public boolean isWritable() {
return ((flags & MemoryByte.WRITABLE) == MemoryByte.WRITABLE);
}
/**
* Sets whether this memory byte has changed.
*
* @param changed whether this memory byte has changed
*/
public void setChanged(boolean changed) {
flags |= MemoryByte.CHANGED;
if (!changed)
flags ^= MemoryByte.CHANGED;
}
/**
* Returns whether this memory byte has changed.
*
* @return whether this memory byte has changed
*/
public boolean isChanged() {
return ((flags & MemoryByte.CHANGED) == MemoryByte.CHANGED);
}
/**
* Sets whether the history of this byte is known. When history
* is unknown, the change state of a memory byte has no meaning.
*
* @param known whether the change state of this byte is known
*/
public void setHistoryKnown(boolean known) {
flags |= MemoryByte.HISTORY_KNOWN;
if (!known)
flags ^= MemoryByte.HISTORY_KNOWN;
}
/**
* Returns whether the history of this byte is known. When history
* is unknown, the change state of a memory byte has no meaning.
*
* @return whether the change state of this byte is known
*/
public boolean isHistoryKnown() {
return ((flags & MemoryByte.HISTORY_KNOWN) == MemoryByte.HISTORY_KNOWN);
}
/**
* Sets whether this byte of memory is big endian.
*
* @param isBigEndian whether the byte of memory is big endian.
*/
public void setBigEndian(boolean isBigEndian)
{
flags |= MemoryByte.BIG_ENDIAN;
if (!isBigEndian)
flags ^= MemoryByte.BIG_ENDIAN;
}
/**
* Returns whether this byte of memory is big endian.
*
* @return whether the byte of memory is big endian.
*/
public boolean isBigEndian()
{
return ((flags & MemoryByte.BIG_ENDIAN) == MemoryByte.BIG_ENDIAN);
}
/**
* Sets whether the endianess of this byte of memory is known.
* If the endianess is unknown, the endianess of this byte
* has no meaning.
*
* @param isEndianessKnown whether the endianess of this byte is known.
*/
public void setEndianessKnown(boolean isEndianessKnown)
{
flags |= MemoryByte.ENDIANESS_KNOWN;
if (!isEndianessKnown)
flags ^= MemoryByte.ENDIANESS_KNOWN;
}
/**
* Returns whether the endianess of this byte of memory is known.
* If the endianess is unknown, the endianess of this byte
* has no meaning.
*
* @return whether the endianess of this byte of memory is known.
*/
public boolean isEndianessKnown()
{
return ((flags & MemoryByte.ENDIANESS_KNOWN) == MemoryByte.ENDIANESS_KNOWN);
}
}