#include <memory>
#include <iostream>
namespace wyf {
// a stub to get things compiled
template <class>
struct EmptyBaseOptimizationHelper
{
int capacity_;
template <class X, class Y> EmptyBaseOptimizationHelper(X, Y) {}
};
template<typename Tp, typename Allocator = std::allocator<Tp>>
class vector {
public:
// linker error occurs when calling this ctor with certain arguments
vector(std::size_t n, const Tp& val, const Allocator& alloc = Allocator());
// omitting other member functions.
private: // three data members to hold the objects and raw memory
Tp* begin_; // using pointer = value_type*;
Tp* end_;
using allocator_type =Allocator;
// Empty Base Optimization Helper class to hold both Allocator and capacity_
EmptyBaseOptimizationHelper<allocator_type> capacity_;
};
// still in vector.hpp, the implemention goes below
template<typename Tp, typename Allocator>
vector<Tp, Allocator>::vector(std::size_t n, const Tp& val, const Allocator& alloc) :
begin_(nullptr), end_(nullptr), capacity_(nullptr, alloc) {
}
}
int main() {
wyf::vector<int> v2(10, 20);
std::cout << "It works";
}
I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKCm5hbWVzcGFjZSB3eWYgewoKICAgIC8vIGEgc3R1YiB0byBnZXQgdGhpbmdzIGNvbXBpbGVkCiAgICB0ZW1wbGF0ZSA8Y2xhc3M+CiAgICAgICAgc3RydWN0IEVtcHR5QmFzZU9wdGltaXphdGlvbkhlbHBlcgogICAgICAgIHsKICAgICAgICAgICAgaW50IGNhcGFjaXR5XzsKICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+IEVtcHR5QmFzZU9wdGltaXphdGlvbkhlbHBlcihYLCBZKSB7fQogICAgICAgIH07CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVHAsIHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPFRwPj4KICAgICAgICBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgcHVibGljOgogICAgICAgICAgICAvLyBsaW5rZXIgZXJyb3Igb2NjdXJzIHdoZW4gY2FsbGluZyB0aGlzIGN0b3Igd2l0aCBjZXJ0YWluIGFyZ3VtZW50cwogICAgICAgICAgICB2ZWN0b3Ioc3RkOjpzaXplX3QgbiwgY29uc3QgVHAmIHZhbCwgY29uc3QgQWxsb2NhdG9yJiBhbGxvYyA9IEFsbG9jYXRvcigpKTsKICAgICAgICAgICAgLy8gb21pdHRpbmcgb3RoZXIgbWVtYmVyIGZ1bmN0aW9ucy4KICAgICAgICAgIHByaXZhdGU6IC8vIHRocmVlIGRhdGEgbWVtYmVycyB0byBob2xkIHRoZSBvYmplY3RzIGFuZCByYXcgbWVtb3J5CiAgICAgICAgICAgIFRwKiBiZWdpbl87IC8vIHVzaW5nIHBvaW50ZXIgPSB2YWx1ZV90eXBlKjsKICAgICAgICAgICAgVHAqIGVuZF87CiAgICAgICAgICAgIHVzaW5nIGFsbG9jYXRvcl90eXBlID1BbGxvY2F0b3I7CiAgICAgICAgICAgIC8vIEVtcHR5IEJhc2UgT3B0aW1pemF0aW9uIEhlbHBlciBjbGFzcyB0byBob2xkIGJvdGggQWxsb2NhdG9yIGFuZCBjYXBhY2l0eV8KICAgICAgICAgICAgRW1wdHlCYXNlT3B0aW1pemF0aW9uSGVscGVyPGFsbG9jYXRvcl90eXBlPiBjYXBhY2l0eV87CiAgICAgICAgfTsKICAgIC8vIHN0aWxsIGluIHZlY3Rvci5ocHAsIHRoZSBpbXBsZW1lbnRpb24gZ29lcyBiZWxvdwogICAgdGVtcGxhdGU8dHlwZW5hbWUgVHAsIHR5cGVuYW1lIEFsbG9jYXRvcj4KICAgICAgICB2ZWN0b3I8VHAsIEFsbG9jYXRvcj46OnZlY3RvcihzdGQ6OnNpemVfdCBuLCBjb25zdCBUcCYgdmFsLCBjb25zdCBBbGxvY2F0b3ImIGFsbG9jKSA6CiAgICAgICAgICAgIGJlZ2luXyhudWxscHRyKSwgZW5kXyhudWxscHRyKSwgY2FwYWNpdHlfKG51bGxwdHIsIGFsbG9jKSB7CiAgICAgICAgICAgIH0KfQoKaW50IG1haW4oKSB7CiAgd3lmOjp2ZWN0b3I8aW50PiB2MigxMCwgMjApOwogIHN0ZDo6Y291dCA8PCAiSXQgd29ya3MiOwp9Cg==