Added ArrayIndexPath, a small class storing a index list for identifying an

element in a multi-dimensional array, featuring conversion from and to string.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33393 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2009-10-01 09:37:24 +00:00
parent 8ad4a2e971
commit 4fc4757d3d
3 changed files with 165 additions and 0 deletions

View File

@ -140,6 +140,7 @@ Application Debugger :
X86AssemblyLanguage.cpp
# types
ArrayIndexPath.cpp
TargetAddressRangeList.cpp
ValueLocation.cpp

View File

@ -0,0 +1,100 @@
/*
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#include "ArrayIndexPath.h"
#include <stdlib.h>
#include <String.h>
static const char kIndexSeparator = ';';
ArrayIndexPath::ArrayIndexPath()
{
}
ArrayIndexPath::ArrayIndexPath(const ArrayIndexPath& other)
:
fIndices(other.fIndices)
{
}
ArrayIndexPath::~ArrayIndexPath()
{
}
bool
ArrayIndexPath::SetTo(const char* path)
{
fIndices.Clear();
if (path == NULL)
return true;
while (*path != '\0') {
char* numberEnd;
int64 index = strtoll(path, &numberEnd, 0);
if (numberEnd == path)
return false;
path = numberEnd;
if (!fIndices.Add(index))
return false;
if (*path == '\0')
break;
if (*path != kIndexSeparator)
return false;
path++;
}
return true;
}
void
ArrayIndexPath::Clear()
{
fIndices.Clear();
}
bool
ArrayIndexPath::GetPathString(BString& path) const
{
path.Truncate(0);
int32 count = CountIndices();
for (int32 i = 0; i < count; i++) {
// append separator for all but the first index
if (i > 0) {
int32 oldLength = path.Length();
if (path.Append(kIndexSeparator, 1).Length() != oldLength + 1)
return false;
}
// append index
int32 oldLength = path.Length();
if ((path << IndexAt(i)).Length() == oldLength)
return false;
}
return true;
}
ArrayIndexPath&
ArrayIndexPath::operator=(const ArrayIndexPath& other)
{
fIndices = other.fIndices;
return *this;
}

View File

@ -0,0 +1,64 @@
/*
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#ifndef ARRAY_INDEX_PATH_H
#define ARRAY_INDEX_PATH_H
#include "Array.h"
#include "Types.h"
class BString;
class ArrayIndexPath {
public:
ArrayIndexPath();
ArrayIndexPath(const ArrayIndexPath& other);
~ArrayIndexPath();
bool SetTo(const char* path);
void Clear();
bool GetPathString(BString& path) const;
inline int32 CountIndices() const;
inline int64 IndexAt(int32 index) const;
inline bool AddIndex(int64 index);
ArrayIndexPath& operator=(const ArrayIndexPath& other);
private:
typedef Array<int64> IndexArray;
private:
IndexArray fIndices;
};
int32
ArrayIndexPath::CountIndices() const
{
return fIndices.Count();
}
int64
ArrayIndexPath::IndexAt(int32 index) const
{
return index >= 0 && index < fIndices.Count()
? fIndices.ElementAt(index) : -1;
}
bool
ArrayIndexPath::AddIndex(int64 index)
{
return fIndices.Add(index);
}
#endif // ARRAY_INDEX_PATH_H