DataBlock.hh revision 6971:12cfde8f819b
112837Sgabeblack@google.com 212837Sgabeblack@google.com/* 312837Sgabeblack@google.com * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 412837Sgabeblack@google.com * All rights reserved. 512837Sgabeblack@google.com * 612837Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without 712837Sgabeblack@google.com * modification, are permitted provided that the following conditions are 812837Sgabeblack@google.com * met: redistributions of source code must retain the above copyright 912837Sgabeblack@google.com * notice, this list of conditions and the following disclaimer; 1012837Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright 1112837Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the 1212837Sgabeblack@google.com * documentation and/or other materials provided with the distribution; 1312837Sgabeblack@google.com * neither the name of the copyright holders nor the names of its 1412837Sgabeblack@google.com * contributors may be used to endorse or promote products derived from 1512837Sgabeblack@google.com * this software without specific prior written permission. 1612837Sgabeblack@google.com * 1712837Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1812837Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1912837Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2012837Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2112837Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2212837Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2312837Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2412837Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2512837Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2612837Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2712837Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2812837Sgabeblack@google.com */ 2912837Sgabeblack@google.com 3012837Sgabeblack@google.com#ifndef DATABLOCK_H 3113041Sgabeblack@google.com#define DATABLOCK_H 3212837Sgabeblack@google.com 3313251Sgabeblack@google.com#include "mem/ruby/common/Global.hh" 3412837Sgabeblack@google.com#include "mem/ruby/system/System.hh" 3512837Sgabeblack@google.com#include "mem/gems_common/Vector.hh" 3612837Sgabeblack@google.com 3712837Sgabeblack@google.comclass DataBlock { 3813273Sgabeblack@google.com public: 3913273Sgabeblack@google.com // Constructors 4012837Sgabeblack@google.com DataBlock() {alloc();} 4112837Sgabeblack@google.com DataBlock(const DataBlock & cp) { 4212837Sgabeblack@google.com m_data = new uint8[RubySystem::getBlockSizeBytes()]; 4313251Sgabeblack@google.com memcpy(m_data, cp.m_data, RubySystem::getBlockSizeBytes()); 4413041Sgabeblack@google.com m_alloc = true; 4513041Sgabeblack@google.com } 4612837Sgabeblack@google.com 4712837Sgabeblack@google.com // Destructor 4812837Sgabeblack@google.com ~DataBlock() { 49 if(m_alloc) { 50 delete [] m_data; 51 } 52 } 53 54 DataBlock& operator=(const DataBlock& obj); 55 56 // Public Methods 57 void assign(uint8* data); 58 59 void clear(); 60 uint8 getByte(int whichByte) const; 61 const uint8* getData(int offset, int len) const; 62 void setByte(int whichByte, uint8 data); 63 void setData(uint8* data, int offset, int len); 64 void copyPartial(const DataBlock & dblk, int offset, int len); 65 bool equal(const DataBlock& obj) const; 66 void print(ostream& out) const; 67 68private: 69 void alloc(); 70 // Data Members (m_ prefix) 71 uint8* m_data; 72 bool m_alloc; 73}; 74 75// Output operator declaration 76ostream& operator<<(ostream& out, const DataBlock& obj); 77 78bool operator==(const DataBlock& obj1, const DataBlock& obj2); 79 80// inline functions for speed 81 82inline 83void DataBlock::assign(uint8* data) 84{ 85 if (m_alloc) { 86 delete [] m_data; 87 } 88 m_data = data; 89 m_alloc = false; 90} 91 92inline 93void DataBlock::alloc() 94{ 95 m_data = new uint8[RubySystem::getBlockSizeBytes()]; 96 m_alloc = true; 97 clear(); 98} 99 100inline 101void DataBlock::clear() 102{ 103 memset(m_data, 0, RubySystem::getBlockSizeBytes()); 104} 105 106inline 107bool DataBlock::equal(const DataBlock& obj) const 108{ 109 return !memcmp(m_data, obj.m_data, RubySystem::getBlockSizeBytes()); 110} 111 112inline 113void DataBlock::print(ostream& out) const 114{ 115 int size = RubySystem::getBlockSizeBytes(); 116 out << "[ "; 117 for (int i = 0; i < size; i++) { 118 out << setw(2) << setfill('0') << hex << "0x" << (int)m_data[i] << " "; 119 out << setfill(' '); 120 } 121 out << dec << "]" << flush; 122} 123 124inline 125uint8 DataBlock::getByte(int whichByte) const 126{ 127 return m_data[whichByte]; 128} 129 130inline 131const uint8* DataBlock::getData(int offset, int len) const 132{ 133 assert(offset + len <= RubySystem::getBlockSizeBytes()); 134 return &m_data[offset]; 135} 136 137inline 138void DataBlock::setByte(int whichByte, uint8 data) 139{ 140 m_data[whichByte] = data; 141} 142 143inline 144void DataBlock::setData(uint8* data, int offset, int len) 145{ 146 assert(offset + len <= RubySystem::getBlockSizeBytes()); 147 memcpy(&m_data[offset], data, len); 148} 149 150inline 151void DataBlock::copyPartial(const DataBlock & dblk, int offset, int len) 152{ 153 setData(&dblk.m_data[offset], offset, len); 154} 155 156// ******************* Definitions ******************* 157 158// Output operator definition 159extern inline 160ostream& operator<<(ostream& out, const DataBlock& obj) 161{ 162 obj.print(out); 163 out << flush; 164 return out; 165} 166 167extern inline 168bool operator==(const DataBlock& obj1,const DataBlock& obj2) 169{ 170 return (obj1.equal(obj2)); 171} 172 173#endif //DATABLOCK_H 174