#ifndef _SpatialDomain_h
#define _SpatialDomain_h

//#     Filename:       SpatialDomain.h
//#
//#     Classes defined here: SpatialDomain
//#
//#
//#     Author:         Peter Z. Kunszt
//#     
//#     Date:           October 16, 1998
//#
//#		Copyright (C) 2000  Peter Z. Kunszt, Alex S. Szalay, Aniruddha R. Thakar
//#                     The Johns Hopkins University
//#
//#     Modification History:
//#
//#     Oct 18, 2001 : Dennis C. Dinge -- Replaced ValVec with std::vector
//#

#include "SpatialConvex.h"
#include "BitList.h"

//########################################################################
//
// Spatial Domain class
//
// 

/** A spatial domain is a list of spatial convexes. So we can have
 really disjoint pieces of the sky defined by a domain.  */

class LINKAGE SpatialDomain {
public:
  /// Constructor
  SpatialDomain(const SpatialIndex * idx = 0);

  /// Destructor
  ~SpatialDomain();

  /// Set index pointer
  void setIndex(const SpatialIndex *);

  /// Add a convex
  void add(SpatialConvex &);

  /// Simplify the Domain, remove redundancies
  void simplify();

  /** Intersect with index. 
      Return the bitlist of the leafnodes that are
      partially and fully intersected by this domain. */
  bool intersect(const SpatialIndex * idx, 
		 BitList & partial, BitList & full);

  /// Same intersection, but return vectors of ids instead of bitlists.
  bool intersect(const SpatialIndex * idx, 
		 ValueVectorUint64 & partial, ValueVectorUint64 & full);

  /// Same intersection, but return just a list of IDs not level depth
  bool intersect(const SpatialIndex * idx, ValueVectorUint64 & idlist);

  /// numConvexes: give back the number of convexes
  size_t numConvexes();

  /// [] operator: give back convex
  SpatialConvex & operator [](size_t i);

  /// read from stream
  void read(istream&);

  /// write to stream
  void write(ostream&) const;

  const SpatialIndex * index; 		/// A pointer to the index

  static void ignoreCrLf(istream &);
protected:
	std::vector<SpatialConvex> convexes_;      /// The vector of convexes

public:
  static uint64 topBit_;
};

#include "SpatialDomain.hxx"
#endif
