#include <xtd/xtd>
class program {
public:
static auto main() -> void {
auto boxes = box_collection {};
boxes.add(program::box {10, 4, 6});
boxes.add(program::box {4, 6, 10});
boxes.add(program::box {6, 10, 4});
boxes.add(program::box {12, 8, 10});
boxes.add(program::box {10, 4, 6});
display(boxes);
console::write_line("Removing 6x10x4");
boxes.remove(program::box {6, 10, 4});
display(boxes);
auto box_check = program::box {8, 12, 10};
console::write_line("Contains {}x{}x{} by dimensions: {}", box_check.height, box_check.length, box_check.width, boxes.contains(box_check));
console::write_line("Contains {}x{}x{} by volume: {}", box_check.height, box_check.length, box_check.width, boxes.contains(box_check, box_same_volume {}));
}
box(
int h,
int l,
int w) : height {h}, length{l}, width {w} {}
int height = 0;
int length = 0;
int width = 0;
bool equals(const object& o) const noexcept override {return is<program::box>(o) && equals(as<program::box>(o));}
bool equals(const program::box& o) const noexcept override {return box_same_dimensions {}.equals(*this, o);}
};
class box_collection :
public ilist<program::box> {
public:
box_collection(const std::initializer_list<program::box>& boxes) : boxes_(boxes) {}
size count()
const noexcept override {
return boxes_.count();}
bool is_fixed_size() const noexcept override {return false;}
bool is_read_only() const noexcept override {return false;}
bool is_synchronized() const noexcept override {return false;}
const object& sync_root() const noexcept override {return sync_root_;}
void add(const program::box& item) override {
if (!contains(item))
boxes_.add(item);
else
console::write_line("A box with {}x{}x{} dimensions was already added to the collection.", item.height, item.length, item.width);
}
void clear() override {boxes_.clear();}
bool contains(const program::box& item) const noexcept override {return index_of(item) != npos;}
return false;
}
size index_of(
const program::box& item)
const noexcept override {
for (auto index = 0_z; index < count(); ++index)
if (boxes_[index] == item) return index;
return npos;
}
void insert(
size index,
const program::box& item)
override {
boxes_.insert(boxes_.begin() + index, item);
}
bool remove(const program::box& item) override {return boxes_.remove(item);}
void remove_at(
size index)
override {
boxes_.erase(boxes_.begin() + index);
}
const program::box& operator [](
size index)
const override {
return boxes_[index];
}
program::box& operator [](
size index)
override {
return boxes_[index];
}
private:
object sync_root_;
};
class box_enumerator :
public ienumerator<program::box> {
public:
const program::box& current() const override {return items_[index_];}
bool move_next() override {return ++index_ < items_.size();}
protected:
};
public:
bool equals(const program::box& b1, const program::box& b2) const noexcept override {return b1.height == b2.height && b1.length == b2.length && b1.width == b2.width;}
size get_hash_code(
const program::box&
box)
const noexcept override {
return hash_code::combine(
box.height,
box.length,
box.width);}
};
public:
bool equals(const program::box& b1, const program::box& b2) const noexcept override {return b1.height * b1.length * b1.width == b2.height * b2.length * b2.width;}
size get_hash_code(
const program::box&
box)
const noexcept override {
}
};
static void display(const box_collection& boxes) {
console::write_line("\nheight length width hash code");
for (auto index = 0_z; index < boxes.count(); ++index)
console::write_line("{,-6} {,-6} {,-6} {}", boxes[index].height, boxes[index].length, boxes[index].width, boxes[index].get_hash_code());
console::write_line();
}
};
The exception that is thrown when one of the arguments provided to a method is out of range.
Definition argument_out_of_range_exception.h:23
Provides methods for creating, manipulating, searching, and sorting arrays, thereby serving as the ba...
Definition array.h:58
Represents a boxed integer object.
Definition box_integer.h:52
Represents a boxed object.
Definition box.h:53
Provides a base class for implementations of the xtd::collections::generic::icomparer <type_t> generi...
Definition comparer.h:32
Supports a simple iteration over a generic collection.
Definition enumerator.h:31
Supports a simple iteration over a generic collection.
Definition ienumerator.h:58
Defines methods to support the comparison of objects for equality.
Definition iequality_comparer.h:34
Represents a collection of objects that can be individually accessed by index.
Definition ilist.h:41
Represents a strongly typed list of objects that can be accessed by index. Provides methods to search...
Definition list.h:71
Combines the hash code for multiple values into a single hash code.
Definition hash_code.h:26
Defines a generalized method that a value type or class implements to create a type-specific method f...
Definition iequatable.h:22
Supports all classes in the xtd class hierarchy and provides low-level services to derived classes....
Definition object.h:42
virtual bool equals(const object &obj) const noexcept
Determines whether the specified object is equal to the current object.
#define startup_(main_method)
Defines the entry point to be called when the application loads. Generally this is set either to the ...
Definition startup.h:175
size_t size
Represents a size of any object in bytes.
Definition size.h:23
The xtd::collections::generic namespace contains interfaces and classes that define generic collectio...
Definition comparer.h:15
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition xtd_about_box.h:10