1/*
2 * Copyright 2013, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Ingo Weinhold <ingo_weinhold@gmx.de>
7 */
8
9
10#include <package/solver/SolverPackageSpecifierList.h>
11
12#include <new>
13#include <vector>
14
15#include <package/solver/SolverPackageSpecifier.h>
16
17
18namespace BPackageKit {
19
20class BSolverPackageSpecifierList::Vector
21	: public std::vector<BSolverPackageSpecifier> {
22public:
23	Vector()
24		:
25		std::vector<BSolverPackageSpecifier>()
26	{
27	}
28
29	Vector(const std::vector<BSolverPackageSpecifier>& other)
30		:
31		std::vector<BSolverPackageSpecifier>(other)
32	{
33	}
34};
35
36
37BSolverPackageSpecifierList::BSolverPackageSpecifierList()
38	:
39	fSpecifiers(NULL)
40{
41}
42
43
44BSolverPackageSpecifierList::BSolverPackageSpecifierList(
45	const BSolverPackageSpecifierList& other)
46	:
47	fSpecifiers(NULL)
48{
49	*this = other;
50}
51
52
53BSolverPackageSpecifierList::~BSolverPackageSpecifierList()
54{
55	delete fSpecifiers;
56}
57
58
59bool
60BSolverPackageSpecifierList::IsEmpty() const
61{
62	return fSpecifiers == NULL || fSpecifiers->empty();
63}
64
65
66int32
67BSolverPackageSpecifierList::CountSpecifiers() const
68{
69	return fSpecifiers != NULL ? fSpecifiers->size() : 0;
70}
71
72
73const BSolverPackageSpecifier*
74BSolverPackageSpecifierList::SpecifierAt(int32 index) const
75{
76	if (fSpecifiers == NULL || index < 0
77		|| (size_t)index >= fSpecifiers->size()) {
78		return NULL;
79	}
80
81	return &(*fSpecifiers)[index];
82}
83
84
85bool
86BSolverPackageSpecifierList::AppendSpecifier(
87	const BSolverPackageSpecifier& specifier)
88{
89	try {
90		if (fSpecifiers == NULL) {
91			fSpecifiers = new(std::nothrow) Vector;
92			if (fSpecifiers == NULL)
93				return false;
94		}
95
96		fSpecifiers->push_back(specifier);
97		return true;
98	} catch (std::bad_alloc&) {
99		return false;
100	}
101}
102
103
104bool
105BSolverPackageSpecifierList::AppendSpecifier(BSolverPackage* package)
106{
107	return AppendSpecifier(BSolverPackageSpecifier(package));
108}
109
110
111bool
112BSolverPackageSpecifierList::AppendSpecifier(const BString& selectString)
113{
114	return AppendSpecifier(BSolverPackageSpecifier(selectString));
115}
116
117
118bool
119BSolverPackageSpecifierList::AppendSpecifiers(const char* const* selectStrings,
120	int32 count)
121{
122	for (int32 i = 0; i < count; i++) {
123		if (!AppendSpecifier(selectStrings[i])) {
124			for (int32 k = i - 1; k >= 0; k--)
125				fSpecifiers->pop_back();
126			return false;
127		}
128	}
129
130	return true;
131}
132
133
134void
135BSolverPackageSpecifierList::MakeEmpty()
136{
137	fSpecifiers->clear();
138}
139
140
141BSolverPackageSpecifierList&
142BSolverPackageSpecifierList::operator=(const BSolverPackageSpecifierList& other)
143{
144	if (this == &other)
145		return *this;
146
147	delete fSpecifiers;
148	fSpecifiers = NULL;
149
150	if (other.fSpecifiers == NULL)
151		return *this;
152
153	try {
154		fSpecifiers = new(std::nothrow) Vector(*other.fSpecifiers);
155	} catch (std::bad_alloc&) {
156	}
157
158	return *this;
159}
160
161
162}	// namespace BPackageKit
163