#ifndef _MUTEXNODE_
#define _MUTEXNODE_

#include "ThreadsAndMutexes/mutex/mutex"
#include "error/error"

class MutexNode {
public:
    MutexNode(void *o);
    MutexNode(MutexNode const &other);
    ~MutexNode();

    MutexNode const &operator=(MutexNode const &other);

    void obj(void *o)                   { _obj = o; }
    void *obj() const                   { return _obj; }

    MutexNode *left(MutexNode *l)       { _left = l;  return _left;}
    MutexNode *left() const             { return _left; }

    MutexNode *right(MutexNode *r)      { _right = r; return _right; }
    MutexNode *right() const            { return _right; }

    void lock()                         { _mutex.lock(); }
    void unlock()                       { _mutex.unlock(); }

    Mutex mutex() const                 { return _mutex; }
    void mutex(Mutex m)                 { _mutex = m; }

    int weight() const;
    int balance() const;

private:
    void copy(MutexNode const &other);
    void destroy();

    Mutex _mutex;
    void *_obj;
    MutexNode *_left, *_right;
};

#endif
