vector.hpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Copyright (C) 2008-2018 Lorenzo Caminiti
  2. // Distributed under the Boost Software License, Version 1.0 (see accompanying
  3. // file LICENSE_1_0.txt or a copy at http://www.boost.org/LICENSE_1_0.txt).
  4. // See: http://www.boost.org/doc/libs/release/libs/contract/doc/html/index.html
  5. //[cline90_vector
  6. #ifndef VECTOR_HPP_
  7. #define VECTOR_HPP_
  8. #include <boost/contract.hpp>
  9. // NOTE: Incomplete contract assertions, addressing only `size`.
  10. template<typename T>
  11. class vector
  12. #define BASES private boost::contract::constructor_precondition<vector<T> >
  13. : BASES
  14. {
  15. friend class boost::contract::access;
  16. typedef BOOST_CONTRACT_BASE_TYPES(BASES) base_types;
  17. #undef BASES
  18. void invariant() const {
  19. BOOST_CONTRACT_ASSERT(size() >= 0);
  20. }
  21. public:
  22. explicit vector(int count = 10) :
  23. boost::contract::constructor_precondition<vector>([&] {
  24. BOOST_CONTRACT_ASSERT(count >= 0);
  25. }),
  26. data_(new T[count]),
  27. size_(count)
  28. {
  29. boost::contract::check c = boost::contract::constructor(this)
  30. .postcondition([&] {
  31. BOOST_CONTRACT_ASSERT(size() == count);
  32. })
  33. ;
  34. for(int i = 0; i < size_; ++i) data_[i] = T();
  35. }
  36. virtual ~vector() {
  37. boost::contract::check c = boost::contract::destructor(this);
  38. delete[] data_;
  39. }
  40. int size() const {
  41. boost::contract::check c = boost::contract::public_function(this);
  42. return size_; // Non-negative result already checked by invariant.
  43. }
  44. void resize(int count) {
  45. boost::contract::check c = boost::contract::public_function(this)
  46. .precondition([&] {
  47. BOOST_CONTRACT_ASSERT(count >= 0);
  48. })
  49. .postcondition([&] {
  50. BOOST_CONTRACT_ASSERT(size() == count);
  51. })
  52. ;
  53. T* slice = new T[count];
  54. for(int i = 0; i < count && i < size_; ++i) slice[i] = data_[i];
  55. delete[] data_;
  56. data_ = slice;
  57. size_ = count;
  58. }
  59. T& operator[](int index) {
  60. boost::contract::check c = boost::contract::public_function(this)
  61. .precondition([&] {
  62. BOOST_CONTRACT_ASSERT(index >= 0);
  63. BOOST_CONTRACT_ASSERT(index < size());
  64. })
  65. ;
  66. return data_[index];
  67. }
  68. T const& operator[](int index) const {
  69. boost::contract::check c = boost::contract::public_function(this)
  70. .precondition([&] {
  71. BOOST_CONTRACT_ASSERT(index >= 0);
  72. BOOST_CONTRACT_ASSERT(index < size());
  73. })
  74. ;
  75. return data_[index];
  76. }
  77. private:
  78. T* data_;
  79. int size_;
  80. };
  81. #endif // #include guard
  82. //]