#ifndef SLIST_H
#define SLIST_H

template<typename T>
class SList {
public:
    SList() : _next(0) { }

protected:

    static void _add(T* self) {
        T* tmp = _s_first;
        _s_first = self;
        self->_next = tmp;
    }

    static void _remove(T* self) {
        if (_s_first == self) {
            _s_first = self->_next;
            self->_next = 0;
            return;
        }

        for (T* prev = _s_first; prev->_next; prev = prev->_next) {
            if (prev->_next == self) {
                prev->_next = self->_next;
                self->_next = 0;
                return;
            }
        }
    }

    static T* _s_first;
    T* _next;
};


#endif //SLIST_H
