Need help with the replace function in C code needs to be in

Need help with the replace function in C++.. code needs to be in C++. Function body is the ones in the bold letters.

#ifndef PERSISTENT_VECTOR_H
#define PERSISTENT_VECTOR_H

#include
#include
#include
#include
#include

template
class persistent_vector {
private:
class node {
public:
virtual ~node() {}
virtual void print_details() const = 0;
virtual const T& index(size_t height, size_t index) const = 0;
// virtual std::shared_ptr replace(size_t height, size_t index, const T& value) const = 0;
virtual std::shared_ptr push_back(size_t height, size_t index, const T& value) const = 0;
};

typedef std::shared_ptr node_ptr;

class leaf_node : public node {
public:
leaf_node(const T& first ): m_values { first } { }
leaf_node(const T& first, const T& second ) : m_values { first, second} { }
virtual ~leaf_node() { }
void print_details() const {
std::cout << \"leaf \" << this << \" :\";
for(auto& value : m_values) std::cout << \" \" << value;
std::cout << std::endl;
}
const T& index(size_t height, size_t index) const { return m_values.at(index&1); }
/*
node_ptr replace(size_t height, size_t index, const T& value) const {

}
*/

node_ptr push_back(size_t height, size_t index, const T& value) const {
return std::make_shared( m_values[0], value );
}
private:
const std::vector m_values;
};

static bool go_right(size_t index, size_t height) { return index&(1< static bool full_tree(size_t size, size_t height) { return size == (1<<(height+1)); }

static node_ptr make_chain(size_t length, const T& value) {
if (length==0) return std::make_shared(value);
return std::make_shared(make_chain(length-1,value));
}

class internal_node : public node {
public:
internal_node(const node_ptr& left, const node_ptr& right ) : m_left(left), m_right(right) { }
internal_node(const node_ptr& left) : m_left(left) { }
virtual ~internal_node() { }
void print_details() const {
std::cout << \"node \" << this << \" : \" << m_left.get() << \" \" << m_right.get() << std::endl;
m_left->print_details();
if ( m_right ) m_right->print_details();
}
const T& index(size_t height, size_t index) const {
return (go_right(index,height)?m_right:m_left)->index(height-1,index);
}
/*
node_ptr replace(size_t height, size_t index, const T& value) const {

}
*/

node_ptr push_back(size_t height, size_t index, const T& value) const {
if ( go_right(index,height) )
return std::make_shared( m_left,
m_right?m_right->push_back(height-1,index,value):
make_chain(height-1,value) );
return std::make_shared( m_left->push_back(height-1,index,value), m_right);
}
private:
const node_ptr m_left;
const node_ptr m_right;
};

template
std::vector make_pairs(const vector_type& v){
std::vector nodes;
for(size_t i=0; i < v.size(); i+=2 ) {
if ( i+1 < v.size() ) nodes.push_back(std::make_shared(v[i],v[i+1]));
else nodes.push_back(std::make_shared(v[i]));
}
return nodes;
}

node_ptr build_tree(const std::vector& v) {
switch(v.size()) {
case 0: return node_ptr{};
case 1: return v[0];
default: return build_tree(make_pairs(v));
}
}

size_t compute_height(size_t size) { return (m_size>1)?floor(log2(m_size-1)):0; }
persistent_vector( node_ptr head, size_t size) :
m_head(head), m_size(size), m_height(compute_height(size)) { }

public:

persistent_vector(): m_size(0),m_height(0) {}

persistent_vector(const persistent_vector& other) :
m_head(other.m_head),
m_size(other.m_size),
m_height(other.m_height) {}

persistent_vector(const std::vector& v) :
m_head(build_tree(make_pairs(v))),
m_size(v.size()),
m_height(compute_height(m_size)) {}

const persistent_vector& operator=(const persistent_vector& other) {
m_height = other.m_height;
m_size = other.m_size;
m_head = other.m_head;
return *this;
}

const T& at(size_t index) const {
if ( index >= m_size) throw std::out_of_range(\"out-of-range\");
return m_head->index(m_height,index);
}

const T& operator[](size_t index) const {
return at(index);
}

persistent_vector push_back(const T& value) const {
if(m_size==0) return persistent_vector(std::make_shared(value),1);
if( full_tree(m_size,m_height) )
return persistent_vector(
std::make_shared( m_head,
make_chain(m_height,value)),m_size+1);
return persistent_vector(m_head->push_back(m_height,m_size,value),m_size+1);
}

/*
persistent_vector replace(size_t index, const T& value) const {
if ( index >= m_size) throw std::out_of_range(\"out-of-range\");

}
*/

void print_details() const {
std::cout << \"persistent_vector of \" << m_size
<< \" elements with height \" << m_height << std::endl;
if(m_size) m_head->print_details();
}

private:
node_ptr m_head;
size_t m_size;
size_t m_height;
};

#endif // defined PERSISTENT_VECTOR_H

Solution

#ifndef PERSISTENT_VECTOR_H #define PERSISTENT_VECTOR_H #include #include #include #include #include template class persistent_vector { private: class node { public: virtual ~node() {} virtual void print_details() const = 0; virtual const T& index(size_t height, size_t index) const = 0; virtual std::shared_ptr replace(size_t height, size_t index, const T& value) const = 0; virtual std::shared_ptr push_back(size_t height, size_t index, const T& value) const = 0; }; typedef std::shared_ptr node_ptr; class leaf_node : public node { public: leaf_node(const T& first ): m_values { first } { } leaf_node(const T& first, const T& second ) : m_values { first, second} { } virtual ~leaf_node() { } void print_details() const { std::cout << \"leaf \" << this << \" :\"; for(auto& value : m_values) std::cout << \" \" << value; std::cout << std::endl; } const T& index(size_t height, size_t index) const { return m_values.at(index&1); } node_ptr replace(size_t height, size_t index, const T& value) const { if(go_right(index, height)) return std::make_shared( m_values[0], value); else return std::make_shared( value, m_values[1]); } node_ptr push_back(size_t height, size_t index, const T& value) const { return std::make_shared( m_values[0], value ); } private: const std::vector m_values; }; static bool go_right(size_t index, size_t height) { return index&(1<(value); return std::make_shared(make_chain(length-1,value)); } class internal_node : public node { public: internal_node(const node_ptr& left, const node_ptr& right ) : m_left(left), m_right(right) { } internal_node(const node_ptr& left) : m_left(left) { } virtual ~internal_node() { } void print_details() const { std::cout << \"node \" << this << \" : \" << m_left.get() << \" \" << m_right.get() << std::endl; m_left->print_details(); if ( m_right ) m_right->print_details(); } const T& index(size_t height, size_t index) const { return (go_right(index,height)?m_right:m_left)->index(height-1,index); } node_ptr replace(size_t height, size_t index, const T& value) const { if(go_right(index, height)) return std::make_shared( m_left, m_right->replace(height-1, index, value)); else return std::make_shared( m_left->replace(height-1,index,value), m_right); } node_ptr push_back(size_t height, size_t index, const T& value) const { if ( go_right(index,height) ) return std::make_shared( m_left, m_right?m_right->push_back(height-1,index,value): make_chain(height-1,value) ); return std::make_shared( m_left->push_back(height-1,index,value), m_right); } private: const node_ptr m_left; const node_ptr m_right; }; template std::vector make_pairs(const vector_type& v){ std::vector nodes; for(size_t i=0; i < v.size(); i+=2 ) { if ( i+1 < v.size() ) nodes.push_back(std::make_shared(v[i],v[i+1])); else nodes.push_back(std::make_shared(v[i])); } return nodes; } node_ptr build_tree(const std::vector& v) { switch(v.size()) { case 0: return node_ptr{}; case 1: return v[0]; default: return build_tree(make_pairs(v)); } } size_t compute_height(size_t size) { return (m_size>1)?floor(log2(m_size-1)):0; } persistent_vector( node_ptr head, size_t size) : m_head(head), m_size(size), m_height(compute_height(size)) { } public: persistent_vector(): m_size(0),m_height(0) {} persistent_vector(const persistent_vector& other) : m_head(other.m_head), m_size(other.m_size), m_height(other.m_height) {} persistent_vector(const std::vector& v) : m_head(build_tree(make_pairs(v))), m_size(v.size()), m_height(compute_height(m_size)) {} const persistent_vector& operator=(const persistent_vector& other) { m_height = other.m_height; m_size = other.m_size; m_head = other.m_head; return *this; } const T& at(size_t index) const { if ( index >= m_size) throw std::out_of_range(\"out-of-range\"); return m_head->index(m_height,index); } const T& operator[](size_t index) const { return at(index); } persistent_vector push_back(const T& value) const { if(m_size==0) return persistent_vector(std::make_shared(value),1); if( full_tree(m_size,m_height) ) return persistent_vector( std::make_shared( m_head, make_chain(m_height,value)),m_size+1); return persistent_vector(m_head->push_back(m_height,m_size,value),m_size+1); } persistent_vector replace(size_t index, const T& value) const { if ( index >= m_size) throw std::out_of_range(\"out-of-range\"); return persistent_vector(m_head->replace(m_height, index, value), m_size); } void print_details() const { std::cout << \"persistent_vector of \" << m_size << \" elements with height \" << m_height << std::endl; if(m_size) m_head->print_details(); } private: node_ptr m_head; size_t m_size; size_t m_height; }; #endif // defined PERSISTENT_VECTOR_H
Need help with the replace function in C++.. code needs to be in C++. Function body is the ones in the bold letters. #ifndef PERSISTENT_VECTOR_H #define PERSIST
Need help with the replace function in C++.. code needs to be in C++. Function body is the ones in the bold letters. #ifndef PERSISTENT_VECTOR_H #define PERSIST
Need help with the replace function in C++.. code needs to be in C++. Function body is the ones in the bold letters. #ifndef PERSISTENT_VECTOR_H #define PERSIST
Need help with the replace function in C++.. code needs to be in C++. Function body is the ones in the bold letters. #ifndef PERSISTENT_VECTOR_H #define PERSIST

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site