#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.hpp:23
 
Provides methods for creating, manipulating, searching, and sorting arrays, thereby serving as the ba...
Definition array.hpp:58
 
Represents a boxed integer object.
Definition box_integer.hpp:52
 
Represents a boxed object.
Definition box.hpp:53
 
Provides a base class for implementations of the xtd::collections::generic::icomparer <type_t> generi...
Definition comparer.hpp:32
 
Supports a simple iteration over a generic collection.
Definition enumerator.hpp:31
 
Supports a simple iteration over a generic collection.
Definition ienumerator.hpp:58
 
Defines methods to support the comparison of objects for equality.
Definition iequality_comparer.hpp:34
 
Represents a collection of objects that can be individually accessed by index.
Definition ilist.hpp:41
 
Represents a strongly typed list of objects that can be accessed by index. Provides methods to search...
Definition list.hpp:71
 
Combines the hash code for multiple values into a single hash code.
Definition hash_code.hpp:26
 
Defines a generalized method that a value type or class implements to create a type-specific method f...
Definition iequatable.hpp:22
 
Supports all classes in the xtd class hierarchy and provides low-level services to derived classes....
Definition object.hpp: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.hpp:175
 
size_t size
Represents a size of any object in bytes.
Definition size.hpp:23
 
The xtd::collections::generic namespace contains interfaces and classes that define generic collectio...
Definition comparer.hpp:15
 
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition xtd_about_box.hpp:10