1// Copyright 2005 Google Inc. All Rights Reserved.
2
3#ifndef UTIL_GEOMETRY_S2REGIONUNION_H__
4#define UTIL_GEOMETRY_S2REGIONUNION_H__
5
6#include <vector>
7using std::vector;
8
9#include "base/basictypes.h"
10#include "base/logging.h"
11#include "base/macros.h"
12#include "s2region.h"
13
14class S2Cap;
15class S2Cell;
16class S2LatLngRect;
17
18// An S2RegionUnion represents a union of possibly overlapping regions.
19// It is convenient for computing a covering of a set of regions.
20class S2RegionUnion : public S2Region {
21 public:
22 // Create an empty region. Can be made non-empty by calling Init() or Add().
23 S2RegionUnion();
24
25 // Create a region representing the union of the given regions.
26 // Takes ownership of all regions and clears the given vector.
27 S2RegionUnion(vector<S2Region*>* regions);
28
29 virtual ~S2RegionUnion();
30
31 // Initialize region by taking ownership of the given regions.
32 void Init(vector<S2Region*>* regions);
33
34 // Release ownership of the regions of this union, and appends them to
35 // "regions" if non-NULL. Resets the region to be empty.
36 void Release(vector<S2Region*>* regions);
37
38 // Add the given region to the union. This method can be called repeatedly
39 // as an alternative to Init().
40 // Takes ownership of the pointer.
41 void Add(S2Region* region);
42
43 // Accessor methods.
44 int num_regions() const { return regions_.size(); }
45 inline S2Region* region(int i) const { return regions_[i]; }
46
47 ////////////////////////////////////////////////////////////////////////
48 // S2Region interface (see s2region.h for details):
49
50 virtual S2RegionUnion* Clone() const;
51 virtual S2Cap GetCapBound() const;
52 virtual S2LatLngRect GetRectBound() const;
53 virtual bool VirtualContainsPoint(S2Point const& p) const;
54 bool Contains(S2Point const& p) const;
55 virtual bool Contains(S2Cell const& cell) const;
56 virtual bool MayIntersect(S2Cell const& cell) const;
57 virtual void Encode(Encoder* const encoder) const {
58 LOG(FATAL) << "Unimplemented";
59 }
60 virtual bool Decode(Decoder* const decoder) { return false; }
61
62 private:
63 // Internal constructor used only by Clone() that makes a deep copy of
64 // its argument.
65 S2RegionUnion(S2RegionUnion const* src);
66
67 vector<S2Region*> regions_;
68
69 DISALLOW_EVIL_CONSTRUCTORS(S2RegionUnion);
70};
71
72#endif // UTIL_GEOMETRY_S2REGIONUNION_H__
73