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