
/*
 * Copyright 2012 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkBBoxHierarchy_DEFINED
#define SkBBoxHierarchy_DEFINED

#include "SkRect.h"
#include "SkTDArray.h"
#include "SkRefCnt.h"

/**
 * Interface for a client class that implements utility methods needed
 * by SkBBoxHierarchy that require intrinsic knowledge of the data
 * object type that is stored in the bounding box hierarchy.
 */
class SkBBoxHierarchyClient {
public:
    virtual ~SkBBoxHierarchyClient() {}

    /**
     * Implements a rewind stop condition used by rewindInserts
     * Must returns true if 'data' points to an object that should be re-wound
     * by rewinfInserts.
     */
    virtual bool shouldRewind(void* data) = 0;
};

/**
 * Interface for a spatial data structure that associates user data pointers with axis-aligned
 * bounding boxes, and allows efficient retrieval of intersections with query rectangles.
 */
class SkBBoxHierarchy : public SkRefCnt {
public:
    SK_DECLARE_INST_COUNT(SkBBoxHierarchy)

    SkBBoxHierarchy() : fClient(NULL) {}

    /**
     * Insert a data pointer and corresponding bounding box
     * @param data The data pointer, may be NULL
     * @param bounds The bounding box, should not be empty
     * @param defer Whether or not it is acceptable to delay insertion of this element (building up
     *        an entire spatial data structure at once is often faster and produces better
     *        structures than repeated inserts) until flushDeferredInserts is called or the first
     *        search.
     */
    virtual void insert(void* data, const SkIRect& bounds, bool defer = false) = 0;

    /**
     * If any insertions have been deferred, this forces them to be inserted
     */
    virtual void flushDeferredInserts() = 0;

    /**
     * Populate 'results' with data pointers corresponding to bounding boxes that intersect 'query'
     */
    virtual void search(const SkIRect& query, SkTDArray<void*>* results) = 0;

    virtual void clear() = 0;

    /**
     * Gets the number of insertions
     */
    virtual int getCount() const = 0;

    /**
     * Rewinds all the most recently inserted data elements until an element
     * is encountered for which client->shouldRewind(data) returns false. May
     * not rewind elements that were inserted prior to the last call to
     * flushDeferredInserts.
     */
    virtual void rewindInserts() = 0;

    void setClient(SkBBoxHierarchyClient* client) { fClient = client; }

protected:
    SkBBoxHierarchyClient* fClient;

private:
    typedef SkRefCnt INHERITED;
};

#endif
