DataBlock.hh revision 6347:a532849ca78f
1 2/* 3 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer; 10 * redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution; 13 * neither the name of the copyright holders nor the names of its 14 * contributors may be used to endorse or promote products derived from 15 * this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30#ifndef DATABLOCK_H 31#define DATABLOCK_H 32 33#include "mem/ruby/common/Global.hh" 34#include "mem/ruby/system/System.hh" 35#include "mem/gems_common/Vector.hh" 36 37class DataBlock { 38 public: 39 // Constructors 40 DataBlock() {alloc();} 41 DataBlock(const DataBlock & cp) { 42 m_data = new uint8[RubySystem::getBlockSizeBytes()]; 43 memcpy(m_data, cp.m_data, RubySystem::getBlockSizeBytes()); 44 m_alloc = true; 45 } 46 47 // Destructor 48 ~DataBlock() { if(m_alloc) delete [] m_data;} 49 50 DataBlock& operator=(const DataBlock& obj); 51 52 // Public Methods 53 void assign(uint8* data); 54 55 void clear(); 56 uint8 getByte(int whichByte) const; 57 const uint8* getData(int offset, int len) const; 58 void setByte(int whichByte, uint8 data); 59 const uint8* getBlock() const; 60 uint8* copyData(uint8* dest, int offset, int size) const; 61 void setBlock(uint8* data) { setData(data, 0, System::getBlockSizeBytes()); } 62 void setData(uint8* data, int offset, int len); 63 void copyPartial(const DataBlock & dblk, int offset, int len); 64 bool equal(const DataBlock& obj) const; 65 void print(ostream& out) const; 66 67private: 68 void alloc(); 69 // Data Members (m_ prefix) 70 uint8* m_data; 71 bool m_alloc; 72}; 73 74// Output operator declaration 75ostream& operator<<(ostream& out, const DataBlock& obj); 76 77bool operator==(const DataBlock& obj1, const DataBlock& obj2); 78 79// inline functions for speed 80 81inline 82void DataBlock::assign(uint8* data) 83{ 84 delete [] m_data; 85 m_data = data; 86 m_alloc = false; 87} 88 89inline 90void DataBlock::alloc() 91{ 92 m_data = new uint8[RubySystem::getBlockSizeBytes()]; 93 m_alloc = true; 94 clear(); 95} 96 97inline 98void DataBlock::clear() 99{ 100 memset(m_data, 0, RubySystem::getBlockSizeBytes()); 101} 102 103inline 104bool DataBlock::equal(const DataBlock& obj) const 105{ 106 return !memcmp(m_data, obj.m_data, RubySystem::getBlockSizeBytes()); 107} 108 109inline 110void DataBlock::print(ostream& out) const 111{ 112 int size = RubySystem::getBlockSizeBytes(); 113 out << "[ "; 114 for (int i = 0; i < size; i+=4) { 115 out << hex << *((uint32*)(&(m_data[i]))) << " "; 116 } 117 out << dec << "]" << flush; 118} 119 120inline 121uint8 DataBlock::getByte(int whichByte) const 122{ 123 return m_data[whichByte]; 124} 125 126inline 127const uint8* DataBlock::getData(int offset, int len) const 128{ 129 assert(offset + len <= RubySystem::getBlockSizeBytes()); 130 return &m_data[offset]; 131} 132 133inline 134void DataBlock::setByte(int whichByte, uint8 data) 135{ 136 m_data[whichByte] = data; 137} 138 139inline 140void DataBlock::setData(uint8* data, int offset, int len) 141{ 142 assert(offset + len <= RubySystem::getBlockSizeBytes()); 143 memcpy(&m_data[offset], data, len); 144} 145 146inline 147void DataBlock::copyPartial(const DataBlock & dblk, int offset, int len) 148{ 149 setData(&dblk.m_data[offset], offset, len); 150} 151 152inline 153const uint8* DataBlock::getBlock() const 154{ 155 return m_data; 156} 157 158inline 159uint8* DataBlock::copyData(uint8* dest, int offset, int size) const 160{ 161 assert(offset + size <= RubySystem::getBlockSizeBytes()); 162 memcpy(dest, m_data + offset, size); 163 return dest; 164} 165 166 167// ******************* Definitions ******************* 168 169// Output operator definition 170extern inline 171ostream& operator<<(ostream& out, const DataBlock& obj) 172{ 173 obj.print(out); 174 out << flush; 175 return out; 176} 177 178extern inline 179bool operator==(const DataBlock& obj1,const DataBlock& obj2) 180{ 181 return (obj1.equal(obj2)); 182} 183 184#endif //DATABLOCK_H 185