/*
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Copyright 2013, Rene Gollent, rene@gollent.com.
 * Distributed under the terms of the MIT License.
 */
 
 
#include "BaseUnit.h"
 
#include <new>
 
#include "DebugInfoEntries.h"
 
 
BaseUnit::BaseUnit(off_t headerOffset, off_t contentOffset,
	off_t totalSize, off_t abbreviationOffset, uint8 addressSize,
	bool isDwarf64)
	:
	fHeaderOffset(headerOffset),
	fContentOffset(contentOffset),
	fTotalSize(totalSize),
	fAbbreviationOffset(abbreviationOffset),
	fAbbreviationTable(NULL),
	fAddressSize(addressSize),
	fIsDwarf64(isDwarf64)
{
}
 
 
BaseUnit::~BaseUnit()
{
	for (int32 i = 0; i < fEntries.Count(); i++)
		delete fEntries[i];
}
 
 
void
BaseUnit::SetAbbreviationTable(AbbreviationTable* abbreviationTable)
{
	fAbbreviationTable = abbreviationTable;
}
 
 
status_t
BaseUnit::AddDebugInfoEntry(DebugInfoEntry* entry, off_t offset)
{
	if (!fEntries.Add(entry))
		return B_NO_MEMORY;
	if (!fEntryOffsets.Add(offset)) {
		fEntries.Remove(fEntries.Count() - 1);
		return B_NO_MEMORY;
	}
 
	return B_OK;
}
 
 
bool
BaseUnit::ContainsAbsoluteOffset(off_t offset) const
{
	return fHeaderOffset <= offset && fHeaderOffset + fTotalSize > offset;
}
 
 
void
BaseUnit::SetSourceLanguage(const SourceLanguageInfo* language)
{
	fSourceLanguage = language;
}
 
 
int
BaseUnit::CountEntries() const
{
	return fEntries.Count();
}
 
 
void
BaseUnit::GetEntryAt(int index, DebugInfoEntry*& entry,
	off_t& offset) const
{
	entry = fEntries[index];
	offset = fEntryOffsets[index];
}
 
 
DebugInfoEntry*
BaseUnit::EntryForOffset(off_t offset) const
{
	if (fEntries.IsEmpty())
		return NULL;
 
	// binary search
	int lower = 0;
	int upper = fEntries.Count() - 1;
	while (lower < upper) {
		int mid = (lower + upper + 1) / 2;
		if (fEntryOffsets[mid] > offset)
			upper = mid - 1;
		else
			lower = mid;
	}
 
	return fEntryOffsets[lower] == offset ? fEntries[lower] : NULL;
}

V730 Not all members of a class are initialized inside the constructor. Consider inspecting: fSourceLanguage.