root/src/add-ons/kernel/file_systems/netfs/client/QueryIterator.h
// QueryIterator.h

#ifndef NET_FS_QUERY_ITERATOR_H
#define NET_FS_QUERY_ITERATOR_H

#include <Referenceable.h>
#include <util/DoublyLinkedList.h>

class HierarchicalQueryIterator;
class Volume;

// QueryIterator
class QueryIterator : public BReferenceable,
        public DoublyLinkedListLinkImpl<QueryIterator> {
public:
                                                                QueryIterator(Volume* volume);
        virtual                                         ~QueryIterator();

                        Volume*                         GetVolume() const;

                        void                            SetParentIterator(
                                                                                HierarchicalQueryIterator* parent);
                        HierarchicalQueryIterator* GetParentIterator() const;

        virtual status_t                        ReadQuery(struct dirent* buffer,
                                                                        size_t bufferSize, int32 count,
                                                                        int32* countRead, bool* done);

                        struct GetVolumeLink;
                        friend struct GetVolumeLink;

protected:
        virtual void                            LastReferenceReleased();

private:
                        Volume*                         fVolume;
                        HierarchicalQueryIterator* fParentIterator;
                        DoublyLinkedListLink<QueryIterator> fVolumeLink;
};

// HierarchicalQueryIterator
class HierarchicalQueryIterator : public QueryIterator {
public:
                                                                HierarchicalQueryIterator(Volume* volume);
        virtual                                         ~HierarchicalQueryIterator();

                        QueryIterator*          GetCurrentSubIterator() const;
                        QueryIterator*          NextSubIterator();
                        void                            RewindSubIterator();
                        void                            AddSubIterator(QueryIterator* subIterator);
                        void                            RemoveSubIterator(QueryIterator* subIterator);
                        void                            RemoveAllSubIterators(
                                                                        DoublyLinkedList<QueryIterator>&
                                                                                subIterators);

private:
                        DoublyLinkedList<QueryIterator> fSubIterators;
                        QueryIterator*          fCurrentSubIterator;
};

// GetVolumeLink
struct QueryIterator::GetVolumeLink {
        DoublyLinkedListLink<QueryIterator>* operator()(
                QueryIterator* iterator) const
        {
                return &iterator->fVolumeLink;
        }

        const DoublyLinkedListLink<QueryIterator>* operator()(
                const QueryIterator* iterator) const
        {
                return &iterator->fVolumeLink;
        }
};

#endif  // NET_FS_QUERY_ITERATOR_H