You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

374 lines
9.9 KiB
C

// Copyright 2009, Google Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// 3. Neither the name of Google Inc. nor the names of its contributors may be
// used to endorse or promote products derived from this software without
// specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// WARNING: THE VISITOR API IMPLEMENTED IN THIS CLASS IS EXPERIMENTAL AND
// SUBJECT TO CHANGE WITHOUT WARNING.
#ifndef KML_DOM_VISITOR_H__
#define KML_DOM_VISITOR_H__
#include <vector>
#include "kml/base/util.h"
#include "kml/dom/kml_ptr.h"
namespace kmldom {
// A base class implementing a visitor for elements in a kml dom hierarchy.
// This class should be extended to implement specific visitors by overriding
// the approriate VisitXxx() methods.
//
// The Visitor base class will ensure that the expected visit methods are
// invoked even if the element being visited is a sub-type of the element for
// which VisitXxx() was overridden. For example, if VisitContainer() is
// overridden by a subclass then it will be called for any Container elements
// visited, such as Document or Folder.
//
// If you wish to visit an element for several types (for example Container and
// Feature) using a single visitor, the sub-type visit methods should invoke
// their parent class method:
//
// void MyVisitor::VisitContainer(const ContainerPtr& container) {
// // do stuff
// Visitor::VisitContainer(container); // calls VisitFeature()
// }
//
// A visitation over an element hierarchy is controlled by a VisitorDriver
// instance. The choice of driver can affect the order in which elements are
// visited and it is up to the user to select an appropriate driver for their
// needs. A visitor has no requirement to manage the visitation of its child
// elements as this is handled by the chosen driver, although a visitor is free
// to operate on its child elements directly if it so chooses.
//
// In typical usage processing an element hierarchy might look something like:
//
// const KmlPtr& root = GetRootElement();
// MyVisitor visitor();
// SimplePreorderDriver(visitor).Visit(root);
// ProcessResults(visitor.GetResults());
//
class Visitor {
protected:
Visitor();
public:
virtual ~Visitor();
virtual void VisitElement(const ElementPtr& node);
virtual void VisitAbstractLatLonBox(
const AbstractLatLonBoxPtr& element);
virtual void VisitAbstractLink(
const AbstractLinkPtr& element);
virtual void VisitAbstractView(
const AbstractViewPtr& element);
virtual void VisitAlias(
const AliasPtr& element);
virtual void VisitBalloonStyle(
const BalloonStylePtr& element);
virtual void VisitBasicLink(
const BasicLinkPtr& element);
virtual void VisitCamera(
const CameraPtr& element);
virtual void VisitChange(
const ChangePtr& element);
virtual void VisitColorStyle(
const ColorStylePtr& element);
virtual void VisitContainer(
const ContainerPtr& element);
virtual void VisitCoordinates(
const CoordinatesPtr& element);
virtual void VisitCreate(
const CreatePtr& element);
virtual void VisitData(
const DataPtr& element);
virtual void VisitDelete(
const DeletePtr& element);
virtual void VisitDocument(
const DocumentPtr& element);
virtual void VisitExtendedData(
const ExtendedDataPtr& element);
virtual void VisitFeature(
const FeaturePtr& element);
virtual void VisitField(
const FieldPtr& element);
virtual void VisitFolder(
const FolderPtr& element);
virtual void VisitGeometry(
const GeometryPtr& element);
virtual void VisitGroundOverlay(
const GroundOverlayPtr& element);
virtual void VisitGxAnimatedUpdate(
const GxAnimatedUpdatePtr& element);
virtual void VisitGxFlyTo(
const GxFlyToPtr& element);
virtual void VisitGxLatLonQuad(
const GxLatLonQuadPtr& element);
virtual void VisitGxMultiTrack(
const GxMultiTrackPtr& element);
virtual void VisitGxPlaylist(
const GxPlaylistPtr& element);
virtual void VisitGxSimpleArrayData(
const GxSimpleArrayDataPtr& element);
virtual void VisitGxSimpleArrayField(
const GxSimpleArrayFieldPtr& element);
virtual void VisitGxSoundCue(
const GxSoundCuePtr& element);
virtual void VisitGxTimeSpan(
const GxTimeSpanPtr& element);
virtual void VisitGxTimeStamp(
const GxTimeStampPtr& element);
virtual void VisitGxTour(
const GxTourPtr& element);
virtual void VisitGxTourControl(
const GxTourControlPtr& element);
virtual void VisitGxTourPrimitive(
const GxTourPrimitivePtr& element);
virtual void VisitGxTrack(
const GxTrackPtr& element);
virtual void VisitGxWait(
const GxWaitPtr& element);
virtual void VisitHotSpot(
const HotSpotPtr& element);
virtual void VisitIcon(
const IconPtr& element);
virtual void VisitIconStyle(
const IconStylePtr& element);
virtual void VisitIconStyleIcon(
const IconStyleIconPtr& element);
virtual void VisitImagePyramid(
const ImagePyramidPtr& element);
virtual void VisitInnerBoundaryIs(
const InnerBoundaryIsPtr& element);
virtual void VisitItemIcon(
const ItemIconPtr& element);
virtual void VisitKml(
const KmlPtr& element);
virtual void VisitLabelStyle(
const LabelStylePtr& element);
virtual void VisitLatLonAltBox(
const LatLonAltBoxPtr& element);
virtual void VisitLatLonBox(
const LatLonBoxPtr& element);
virtual void VisitLineString(
const LineStringPtr& element);
virtual void VisitLineStyle(
const LineStylePtr& element);
virtual void VisitLinearRing(
const LinearRingPtr& element);
virtual void VisitLink(
const LinkPtr& element);
virtual void VisitLinkSnippet(
const LinkSnippetPtr& element);
virtual void VisitListStyle(
const ListStylePtr& element);
virtual void VisitLocation(
const LocationPtr& element);
virtual void VisitLod(
const LodPtr& element);
virtual void VisitLookAt(
const LookAtPtr& element);
virtual void VisitMetadata(
const MetadataPtr& element);
virtual void VisitModel(
const ModelPtr& element);
virtual void VisitMultiGeometry(
const MultiGeometryPtr& element);
virtual void VisitNetworkLink(
const NetworkLinkPtr& element);
virtual void VisitNetworkLinkControl(
const NetworkLinkControlPtr& element);
virtual void VisitObject(
const ObjectPtr& element);
virtual void VisitOrientation(
const OrientationPtr& element);
virtual void VisitOuterBoundaryIs(
const OuterBoundaryIsPtr& element);
virtual void VisitOverlay(
const OverlayPtr& element);
virtual void VisitOverlayXY(
const OverlayXYPtr& element);
virtual void VisitPair(
const PairPtr& element);
virtual void VisitPhotoOverlay(
const PhotoOverlayPtr& element);
virtual void VisitPlacemark(
const PlacemarkPtr& element);
virtual void VisitPoint(
const PointPtr& element);
virtual void VisitPolyStyle(
const PolyStylePtr& element);
virtual void VisitPolygon(
const PolygonPtr& element);
virtual void VisitRegion(
const RegionPtr& element);
virtual void VisitResourceMap(
const ResourceMapPtr& element);
virtual void VisitRotationXY(
const RotationXYPtr& element);
virtual void VisitScale(
const ScalePtr& element);
virtual void VisitSchema(
const SchemaPtr& element);
virtual void VisitSchemaData(
const SchemaDataPtr& element);
virtual void VisitScreenOverlay(
const ScreenOverlayPtr& element);
virtual void VisitScreenXY(
const ScreenXYPtr& element);
virtual void VisitSimpleData(
const SimpleDataPtr& element);
virtual void VisitSimpleField(
const SimpleFieldPtr& element);
virtual void VisitSize(
const SizePtr& element);
virtual void VisitSnippet(
const SnippetPtr& element);
virtual void VisitStyle(
const StylePtr& element);
virtual void VisitStyleMap(
const StyleMapPtr& element);
virtual void VisitStyleSelector(
const StyleSelectorPtr& element);
virtual void VisitSubStyle(
const SubStylePtr& element);
virtual void VisitTimePrimitive(
const TimePrimitivePtr& element);
virtual void VisitTimeSpan(
const TimeSpanPtr& element);
virtual void VisitTimeStamp(
const TimeStampPtr& element);
virtual void VisitUpdate(
const UpdatePtr& element);
virtual void VisitUpdateOperation(
const UpdateOperationPtr& element);
virtual void VisitUrl(
const UrlPtr& element);
virtual void VisitVec2(
const Vec2Ptr& element);
virtual void VisitViewVolume(
const ViewVolumePtr& element);
LIBKML_DISALLOW_EVIL_CONSTRUCTORS(Visitor);
};
} // end namespace kmldom
#endif // KML_DOM_VISITOR_H__