⛏️ index : haiku.git

/*
 * Copyright 2013, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Ingo Weinhold <ingo_weinhold@gmx.de>
 */


#include <package/solver/SolverPackageSpecifierList.h>

#include <new>
#include <vector>

#include <package/solver/SolverPackageSpecifier.h>


namespace BPackageKit {

class BSolverPackageSpecifierList::Vector
	: public std::vector<BSolverPackageSpecifier> {
public:
	Vector()
		:
		std::vector<BSolverPackageSpecifier>()
	{
	}

	Vector(const std::vector<BSolverPackageSpecifier>& other)
		:
		std::vector<BSolverPackageSpecifier>(other)
	{
	}
};


BSolverPackageSpecifierList::BSolverPackageSpecifierList()
	:
	fSpecifiers(NULL)
{
}


BSolverPackageSpecifierList::BSolverPackageSpecifierList(
	const BSolverPackageSpecifierList& other)
	:
	fSpecifiers(NULL)
{
	*this = other;
}


BSolverPackageSpecifierList::~BSolverPackageSpecifierList()
{
	delete fSpecifiers;
}


bool
BSolverPackageSpecifierList::IsEmpty() const
{
	return fSpecifiers == NULL || fSpecifiers->empty();
}


int32
BSolverPackageSpecifierList::CountSpecifiers() const
{
	return fSpecifiers != NULL ? fSpecifiers->size() : 0;
}


const BSolverPackageSpecifier*
BSolverPackageSpecifierList::SpecifierAt(int32 index) const
{
	if (fSpecifiers == NULL || index < 0
		|| (size_t)index >= fSpecifiers->size()) {
		return NULL;
	}

	return &(*fSpecifiers)[index];
}


bool
BSolverPackageSpecifierList::AppendSpecifier(
	const BSolverPackageSpecifier& specifier)
{
	try {
		if (fSpecifiers == NULL) {
			fSpecifiers = new(std::nothrow) Vector;
			if (fSpecifiers == NULL)
				return false;
		}

		fSpecifiers->push_back(specifier);
		return true;
	} catch (std::bad_alloc&) {
		return false;
	}
}


bool
BSolverPackageSpecifierList::AppendSpecifier(BSolverPackage* package)
{
	return AppendSpecifier(BSolverPackageSpecifier(package));
}


bool
BSolverPackageSpecifierList::AppendSpecifier(const BString& selectString)
{
	return AppendSpecifier(BSolverPackageSpecifier(selectString));
}


bool
BSolverPackageSpecifierList::AppendSpecifiers(const char* const* selectStrings,
	int32 count)
{
	for (int32 i = 0; i < count; i++) {
		if (!AppendSpecifier(selectStrings[i])) {
			for (int32 k = i - 1; k >= 0; k--)
				fSpecifiers->pop_back();
			return false;
		}
	}

	return true;
}


void
BSolverPackageSpecifierList::MakeEmpty()
{
	fSpecifiers->clear();
}


BSolverPackageSpecifierList&
BSolverPackageSpecifierList::operator=(const BSolverPackageSpecifierList& other)
{
	if (this == &other)
		return *this;

	delete fSpecifiers;
	fSpecifiers = NULL;

	if (other.fSpecifiers == NULL)
		return *this;

	try {
		fSpecifiers = new(std::nothrow) Vector(*other.fSpecifiers);
	} catch (std::bad_alloc&) {
	}

	return *this;
}


}	// namespace BPackageKit