summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2014-12-04 18:29:42 +0100
committerKonstantin Käfer <mail@kkaefer.com>2014-12-04 20:02:50 +0100
commitabafb52f37beb5659efc2105ccd1568e1f754898 (patch)
tree6a60636d3497560ca61e5aae5f6d7061c4f18553 /include
parentbff6aeb4da41dee1f5f1cfa0be81b6c257257253 (diff)
downloadqtlocation-mapboxgl-abafb52f37beb5659efc2105ccd1568e1f754898.tar.gz
make most headers private
Diffstat (limited to 'include')
-rwxr-xr-xinclude/clipper/clipper.hpp398
-rw-r--r--include/csscolorparser/csscolorparser.hpp44
-rw-r--r--include/libtess2/LICENSE.txt25
-rwxr-xr-xinclude/libtess2/tesselator.h209
-rw-r--r--include/mbgl/geometry/anchor.hpp25
-rw-r--r--include/mbgl/geometry/binpack.hpp100
-rw-r--r--include/mbgl/geometry/buffer.hpp118
-rw-r--r--include/mbgl/geometry/debug_font_buffer.hpp17
-rw-r--r--include/mbgl/geometry/elements_buffer.hpp63
-rw-r--r--include/mbgl/geometry/fill_buffer.hpp21
-rw-r--r--include/mbgl/geometry/geometry.hpp77
-rw-r--r--include/mbgl/geometry/glyph_atlas.hpp54
-rw-r--r--include/mbgl/geometry/icon_buffer.hpp22
-rw-r--r--include/mbgl/geometry/line_buffer.hpp39
-rw-r--r--include/mbgl/geometry/resample.hpp13
-rw-r--r--include/mbgl/geometry/sprite_atlas.hpp81
-rw-r--r--include/mbgl/geometry/static_vertex_buffer.hpp26
-rw-r--r--include/mbgl/geometry/text_buffer.hpp25
-rw-r--r--include/mbgl/geometry/vao.hpp73
-rw-r--r--include/mbgl/map/map.hpp12
-rw-r--r--include/mbgl/map/raster_tile_data.hpp33
-rw-r--r--include/mbgl/map/source.hpp86
-rw-r--r--include/mbgl/map/sprite.hpp79
-rw-r--r--include/mbgl/map/tile_data.hpp88
-rw-r--r--include/mbgl/map/tile_parser.hpp77
-rw-r--r--include/mbgl/map/transform_state.hpp1
-rw-r--r--include/mbgl/map/vector_tile.hpp118
-rw-r--r--include/mbgl/map/vector_tile_data.hpp74
-rw-r--r--include/mbgl/platform/gl.hpp4
-rw-r--r--include/mbgl/renderer/bucket.hpp24
-rw-r--r--include/mbgl/renderer/debug_bucket.hpp35
-rw-r--r--include/mbgl/renderer/fill_bucket.hpp88
-rw-r--r--include/mbgl/renderer/frame_history.hpp40
-rw-r--r--include/mbgl/renderer/line_bucket.hpp62
-rw-r--r--include/mbgl/renderer/painter.hpp259
-rw-r--r--include/mbgl/renderer/prerendered_texture.hpp37
-rw-r--r--include/mbgl/renderer/raster_bucket.hpp38
-rw-r--r--include/mbgl/renderer/symbol_bucket.hpp114
-rw-r--r--include/mbgl/shader/dot_shader.hpp26
-rw-r--r--include/mbgl/shader/gaussian_shader.hpp25
-rw-r--r--include/mbgl/shader/icon_shader.hpp41
-rw-r--r--include/mbgl/shader/line_shader.hpp32
-rw-r--r--include/mbgl/shader/linejoin_shader.hpp27
-rw-r--r--include/mbgl/shader/linepattern_shader.hpp33
-rw-r--r--include/mbgl/shader/outline_shader.hpp25
-rw-r--r--include/mbgl/shader/pattern_shader.hpp29
-rw-r--r--include/mbgl/shader/plain_shader.hpp24
-rw-r--r--include/mbgl/shader/raster_shader.hpp31
-rw-r--r--include/mbgl/shader/sdf_shader.hpp53
-rw-r--r--include/mbgl/shader/shader.hpp28
-rw-r--r--include/mbgl/shader/uniform.hpp53
-rw-r--r--include/mbgl/storage/base_request.hpp62
-rw-r--r--include/mbgl/storage/caching_http_file_source.hpp (renamed from include/mbgl/platform/default/caching_http_file_source.hpp)4
-rw-r--r--include/mbgl/storage/file_request.hpp27
-rw-r--r--include/mbgl/storage/file_request_baton.hpp36
-rw-r--r--include/mbgl/storage/file_source.hpp5
-rw-r--r--include/mbgl/storage/http_request.hpp58
-rw-r--r--include/mbgl/storage/http_request_baton.hpp2
-rw-r--r--include/mbgl/storage/request.hpp5
-rw-r--r--include/mbgl/storage/sqlite_store.hpp48
-rw-r--r--include/mbgl/style/applied_class_properties.hpp39
-rw-r--r--include/mbgl/style/class_dictionary.hpp37
-rw-r--r--include/mbgl/style/class_properties.hpp43
-rw-r--r--include/mbgl/style/filter_expression.hpp125
-rw-r--r--include/mbgl/style/filter_expression_private.hpp118
-rw-r--r--include/mbgl/style/function_properties.hpp55
-rw-r--r--include/mbgl/style/property_fallback.hpp29
-rw-r--r--include/mbgl/style/property_key.hpp70
-rw-r--r--include/mbgl/style/property_transition.hpp15
-rw-r--r--include/mbgl/style/property_value.hpp21
-rw-r--r--include/mbgl/style/style.hpp68
-rw-r--r--include/mbgl/style/style_bucket.hpp112
-rw-r--r--include/mbgl/style/style_layer.hpp89
-rw-r--r--include/mbgl/style/style_layer_group.hpp23
-rw-r--r--include/mbgl/style/style_parser.hpp113
-rw-r--r--include/mbgl/style/style_properties.hpp114
-rw-r--r--include/mbgl/style/style_source.hpp41
-rw-r--r--include/mbgl/style/types.hpp196
-rw-r--r--include/mbgl/style/value.hpp45
-rw-r--r--include/mbgl/style/value_comparison.hpp109
-rw-r--r--include/mbgl/text/collision.hpp58
-rw-r--r--include/mbgl/text/glyph.hpp60
-rw-r--r--include/mbgl/text/glyph_store.hpp99
-rw-r--r--include/mbgl/text/placement.hpp31
-rw-r--r--include/mbgl/text/rotation_range.hpp54
-rw-r--r--include/mbgl/text/types.hpp113
-rw-r--r--include/mbgl/util/clip_ids.hpp38
-rw-r--r--include/mbgl/util/compression.hpp15
-rw-r--r--include/mbgl/util/constants.hpp33
-rw-r--r--include/mbgl/util/error.hpp20
-rw-r--r--include/mbgl/util/interpolate.hpp27
-rw-r--r--include/mbgl/util/io.hpp15
-rw-r--r--include/mbgl/util/mapbox.hpp17
-rw-r--r--include/mbgl/util/mat3.hpp42
-rw-r--r--include/mbgl/util/optional.hpp69
-rw-r--r--include/mbgl/util/pbf.hpp184
-rw-r--r--include/mbgl/util/queue.h92
-rw-r--r--include/mbgl/util/raster.hpp74
-rw-r--r--include/mbgl/util/rect.hpp22
-rw-r--r--include/mbgl/util/sqlite3.hpp74
-rw-r--r--include/mbgl/util/stopwatch.hpp40
-rw-r--r--include/mbgl/util/texture_pool.hpp25
-rw-r--r--include/mbgl/util/token.hpp50
-rw-r--r--include/mbgl/util/transition.hpp78
-rw-r--r--include/mbgl/util/unitbezier.hpp121
-rw-r--r--include/mbgl/util/url.hpp15
-rw-r--r--include/mbgl/util/uv-channel.h29
-rw-r--r--include/mbgl/util/uv-worker.h41
-rw-r--r--include/mbgl/util/uv_detail.hpp177
-rw-r--r--include/mbgl/util/vec.hpp5
-rwxr-xr-xinclude/rapidjson/document.h821
-rwxr-xr-xinclude/rapidjson/filestream.h46
-rwxr-xr-xinclude/rapidjson/internal/pow10.h54
-rwxr-xr-xinclude/rapidjson/internal/stack.h82
-rwxr-xr-xinclude/rapidjson/internal/strfunc.h24
-rwxr-xr-xinclude/rapidjson/prettywriter.h156
-rwxr-xr-xinclude/rapidjson/rapidjson.h525
-rwxr-xr-xinclude/rapidjson/reader.h692
-rwxr-xr-xinclude/rapidjson/stringbuffer.h49
-rwxr-xr-xinclude/rapidjson/writer.h241
120 files changed, 17 insertions, 9226 deletions
diff --git a/include/clipper/clipper.hpp b/include/clipper/clipper.hpp
deleted file mode 100755
index 84870141e7..0000000000
--- a/include/clipper/clipper.hpp
+++ /dev/null
@@ -1,398 +0,0 @@
-/*******************************************************************************
-* *
-* Author : Angus Johnson *
-* Version : 6.1.3a *
-* Date : 22 January 2014 *
-* Website : http://www.angusj.com *
-* Copyright : Angus Johnson 2010-2014 *
-* *
-* License: *
-* Use, modification & distribution is subject to Boost Software License Ver 1. *
-* http://www.boost.org/LICENSE_1_0.txt *
-* *
-* Attributions: *
-* The code in this library is an extension of Bala Vatti's clipping algorithm: *
-* "A generic solution to polygon clipping" *
-* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. *
-* http://portal.acm.org/citation.cfm?id=129906 *
-* *
-* Computer graphics and geometric modeling: implementation and algorithms *
-* By Max K. Agoston *
-* Springer; 1 edition (January 4, 2005) *
-* http://books.google.com/books?q=vatti+clipping+agoston *
-* *
-* See also: *
-* "Polygon Offsetting by Computing Winding Numbers" *
-* Paper no. DETC2005-85513 pp. 565-575 *
-* ASME 2005 International Design Engineering Technical Conferences *
-* and Computers and Information in Engineering Conference (IDETC/CIE2005) *
-* September 24-28, 2005 , Long Beach, California, USA *
-* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf *
-* *
-*******************************************************************************/
-
-#ifndef clipper_hpp
-#define clipper_hpp
-
-#define CLIPPER_VERSION "6.1.3"
-
-//use_int32: When enabled 32bit ints are used instead of 64bit ints. This
-//improve performance but coordinate values are limited to the range +/- 46340
-//#define use_int32
-
-//use_xyz: adds a Z member to IntPoint. Adds a minor cost to perfomance.
-//#define use_xyz
-
-//use_lines: Enables line clipping. Adds a very minor cost to performance.
-//#define use_lines
-
-//use_deprecated: Enables support for the obsolete OffsetPaths() function
-//which has been replace with the ClipperOffset class.
-#define use_deprecated
-
-#include <vector>
-#include <set>
-#include <stdexcept>
-#include <cstring>
-#include <cstdlib>
-#include <ostream>
-#include <functional>
-
-namespace ClipperLib {
-
-enum ClipType { ctIntersection, ctUnion, ctDifference, ctXor };
-enum PolyType { ptSubject, ptClip };
-//By far the most widely used winding rules for polygon filling are
-//EvenOdd & NonZero (GDI, GDI+, XLib, OpenGL, Cairo, AGG, Quartz, SVG, Gr32)
-//Others rules include Positive, Negative and ABS_GTR_EQ_TWO (only in OpenGL)
-//see http://glprogramming.com/red/chapter11.html
-enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative };
-
-#ifdef use_int32
-typedef int cInt;
-typedef unsigned int cUInt;
-#else
-typedef signed long long cInt;
-typedef unsigned long long cUInt;
-#endif
-
-struct IntPoint {
- cInt X;
- cInt Y;
-#ifdef use_xyz
- cInt Z;
- IntPoint(cInt x = 0, cInt y = 0, cInt z = 0): X(x), Y(y), Z(z) {};
-#else
- IntPoint(cInt x = 0, cInt y = 0): X(x), Y(y) {};
-#endif
-
- friend inline bool operator== (const IntPoint& a, const IntPoint& b)
- {
- return a.X == b.X && a.Y == b.Y;
- }
- friend inline bool operator!= (const IntPoint& a, const IntPoint& b)
- {
- return a.X != b.X || a.Y != b.Y;
- }
-};
-//------------------------------------------------------------------------------
-
-typedef std::vector< IntPoint > Path;
-typedef std::vector< Path > Paths;
-
-inline Path& operator <<(Path& poly, const IntPoint& p) {poly.push_back(p); return poly;}
-inline Paths& operator <<(Paths& polys, const Path& p) {polys.push_back(p); return polys;}
-
-std::ostream& operator <<(std::ostream &s, const IntPoint &p);
-std::ostream& operator <<(std::ostream &s, const Path &p);
-std::ostream& operator <<(std::ostream &s, const Paths &p);
-
-struct DoublePoint
-{
- double X;
- double Y;
- DoublePoint(double x = 0, double y = 0) : X(x), Y(y) {}
- DoublePoint(IntPoint ip) : X((double)ip.X), Y((double)ip.Y) {}
-};
-//------------------------------------------------------------------------------
-
-#ifdef use_xyz
-typedef void (*TZFillCallback)(IntPoint& z1, IntPoint& z2, IntPoint& pt);
-#endif
-
-enum InitOptions {ioReverseSolution = 1, ioStrictlySimple = 2, ioPreserveCollinear = 4};
-enum JoinType {jtSquare, jtRound, jtMiter};
-enum EndType {etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound};
-#ifdef use_deprecated
- enum EndType_ {etClosed, etButt = 2, etSquare, etRound};
-#endif
-
-class PolyNode;
-typedef std::vector< PolyNode* > PolyNodes;
-
-class PolyNode
-{
-public:
- PolyNode();
- Path Contour;
- PolyNodes Childs;
- PolyNode* Parent;
- PolyNode* GetNext() const;
- bool IsHole() const;
- bool IsOpen() const;
- int ChildCount() const;
-private:
- unsigned Index; //node index in Parent.Childs
- bool m_IsOpen;
- JoinType m_jointype;
- EndType m_endtype;
- PolyNode* GetNextSiblingUp() const;
- void AddChild(PolyNode& child);
- friend class Clipper; //to access Index
- friend class ClipperOffset;
-};
-
-class PolyTree: public PolyNode
-{
-public:
- ~PolyTree(){Clear();};
- PolyNode* GetFirst() const;
- void Clear();
- int Total() const;
-private:
- PolyNodes AllNodes;
- friend class Clipper; //to access AllNodes
-};
-
-bool Orientation(const Path &poly);
-double Area(const Path &poly);
-int PointInPolygon(const IntPoint &pt, const Path &path);
-
-#ifdef use_deprecated
- void OffsetPaths(const Paths &in_polys, Paths &out_polys,
- double delta, JoinType jointype, EndType_ endtype, double limit = 0);
-#endif
-
-void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType = pftEvenOdd);
-void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType = pftEvenOdd);
-void SimplifyPolygons(Paths &polys, PolyFillType fillType = pftEvenOdd);
-
-void CleanPolygon(const Path& in_poly, Path& out_poly, double distance = 1.415);
-void CleanPolygon(Path& poly, double distance = 1.415);
-void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance = 1.415);
-void CleanPolygons(Paths& polys, double distance = 1.415);
-
-void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed);
-void MinkowskiSum(const Path& pattern, const Paths& paths,
- Paths& solution, PolyFillType pathFillType, bool pathIsClosed);
-void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution);
-
-void PolyTreeToPaths(const PolyTree& polytree, Paths& paths);
-void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths);
-void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths);
-
-void ReversePath(Path& p);
-void ReversePaths(Paths& p);
-
-struct IntRect { cInt left; cInt top; cInt right; cInt bottom; };
-
-//enums that are used internally ...
-enum EdgeSide { esLeft = 1, esRight = 2};
-
-//forward declarations (for stuff used internally) ...
-struct TEdge;
-struct IntersectNode;
-struct LocalMinima;
-struct Scanbeam;
-struct OutPt;
-struct OutRec;
-struct Join;
-
-typedef std::vector < OutRec* > PolyOutList;
-typedef std::vector < TEdge* > EdgeList;
-typedef std::vector < Join* > JoinList;
-typedef std::vector < IntersectNode* > IntersectList;
-
-
-//------------------------------------------------------------------------------
-
-//ClipperBase is the ancestor to the Clipper class. It should not be
-//instantiated directly. This class simply abstracts the conversion of sets of
-//polygon coordinates into edge objects that are stored in a LocalMinima list.
-class ClipperBase
-{
-public:
- ClipperBase();
- virtual ~ClipperBase();
- bool AddPath(const Path &pg, PolyType PolyTyp, bool Closed);
- bool AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed);
- virtual void Clear();
- IntRect GetBounds();
- bool PreserveCollinear() {return m_PreserveCollinear;};
- void PreserveCollinear(bool value) {m_PreserveCollinear = value;};
-protected:
- void DisposeLocalMinimaList();
- TEdge* AddBoundsToLML(TEdge *e, bool IsClosed);
- void PopLocalMinima();
- virtual void Reset();
- TEdge* ProcessBound(TEdge* E, bool IsClockwise);
- void InsertLocalMinima(LocalMinima *newLm);
- void DoMinimaLML(TEdge* E1, TEdge* E2, bool IsClosed);
- TEdge* DescendToMin(TEdge *&E);
- void AscendToMax(TEdge *&E, bool Appending, bool IsClosed);
- LocalMinima *m_CurrentLM;
- LocalMinima *m_MinimaList;
- bool m_UseFullRange;
- EdgeList m_edges;
- bool m_PreserveCollinear;
- bool m_HasOpenPaths;
-};
-//------------------------------------------------------------------------------
-
-class Clipper : public virtual ClipperBase
-{
-public:
- Clipper(int initOptions = 0);
- ~Clipper();
- bool Execute(ClipType clipType,
- Paths &solution,
- PolyFillType subjFillType = pftEvenOdd,
- PolyFillType clipFillType = pftEvenOdd);
- bool Execute(ClipType clipType,
- PolyTree &polytree,
- PolyFillType subjFillType = pftEvenOdd,
- PolyFillType clipFillType = pftEvenOdd);
- bool ReverseSolution() {return m_ReverseOutput;};
- void ReverseSolution(bool value) {m_ReverseOutput = value;};
- bool StrictlySimple() {return m_StrictSimple;};
- void StrictlySimple(bool value) {m_StrictSimple = value;};
- //set the callback function for z value filling on intersections (otherwise Z is 0)
-#ifdef use_xyz
- void ZFillFunction(TZFillCallback zFillFunc);
-#endif
-protected:
- void Reset();
- virtual bool ExecuteInternal();
-private:
- PolyOutList m_PolyOuts;
- JoinList m_Joins;
- JoinList m_GhostJoins;
- IntersectList m_IntersectList;
- ClipType m_ClipType;
- std::set< cInt, std::greater<cInt> > m_Scanbeam;
- TEdge *m_ActiveEdges;
- TEdge *m_SortedEdges;
- bool m_ExecuteLocked;
- PolyFillType m_ClipFillType;
- PolyFillType m_SubjFillType;
- bool m_ReverseOutput;
- bool m_UsingPolyTree;
- bool m_StrictSimple;
-#ifdef use_xyz
- TZFillCallback m_ZFill; //custom callback
-#endif
- void SetWindingCount(TEdge& edge);
- bool IsEvenOddFillType(const TEdge& edge) const;
- bool IsEvenOddAltFillType(const TEdge& edge) const;
- void InsertScanbeam(const cInt Y);
- cInt PopScanbeam();
- void InsertLocalMinimaIntoAEL(const cInt botY);
- void InsertEdgeIntoAEL(TEdge *edge, TEdge* startEdge);
- void AddEdgeToSEL(TEdge *edge);
- void CopyAELToSEL();
- void DeleteFromSEL(TEdge *e);
- void DeleteFromAEL(TEdge *e);
- void UpdateEdgeIntoAEL(TEdge *&e);
- void SwapPositionsInSEL(TEdge *edge1, TEdge *edge2);
- bool IsContributing(const TEdge& edge) const;
- bool IsTopHorz(const cInt XPos);
- void SwapPositionsInAEL(TEdge *edge1, TEdge *edge2);
- void DoMaxima(TEdge *e);
- void PrepareHorzJoins(TEdge* horzEdge, bool isTopOfScanbeam);
- void ProcessHorizontals(bool IsTopOfScanbeam);
- void ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam);
- void AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &pt);
- OutPt* AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &pt);
- OutRec* GetOutRec(int idx);
- void AppendPolygon(TEdge *e1, TEdge *e2);
- void IntersectEdges(TEdge *e1, TEdge *e2,
- const IntPoint &pt, bool protect = false);
- OutRec* CreateOutRec();
- OutPt* AddOutPt(TEdge *e, const IntPoint &pt);
- void DisposeAllOutRecs();
- void DisposeOutRec(PolyOutList::size_type index);
- bool ProcessIntersections(const cInt botY, const cInt topY);
- void BuildIntersectList(const cInt botY, const cInt topY);
- void ProcessIntersectList();
- void ProcessEdgesAtTopOfScanbeam(const cInt topY);
- void BuildResult(Paths& polys);
- void BuildResult2(PolyTree& polytree);
- void SetHoleState(TEdge *e, OutRec *outrec);
- void DisposeIntersectNodes();
- bool FixupIntersectionOrder();
- void FixupOutPolygon(OutRec &outrec);
- bool IsHole(TEdge *e);
- bool FindOwnerFromSplitRecs(OutRec &outRec, OutRec *&currOrfl);
- void FixHoleLinkage(OutRec &outrec);
- void AddJoin(OutPt *op1, OutPt *op2, const IntPoint offPt);
- void ClearJoins();
- void ClearGhostJoins();
- void AddGhostJoin(OutPt *op, const IntPoint offPt);
- bool JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2);
- void JoinCommonEdges();
- void DoSimplePolygons();
- void FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec);
- void FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec);
-#ifdef use_xyz
- void SetZ(IntPoint& pt, TEdge& e);
-#endif
-};
-//------------------------------------------------------------------------------
-
-class ClipperOffset
-{
-public:
- ClipperOffset(double miterLimit = 2.0, double roundPrecision = 0.25);
- ~ClipperOffset();
- void AddPath(const Path& path, JoinType joinType, EndType endType);
- void AddPaths(const Paths& paths, JoinType joinType, EndType endType);
- void Execute(Paths& solution, double delta);
- void Execute(PolyTree& solution, double delta);
- void Clear();
- double MiterLimit;
- double ArcTolerance;
-private:
- Paths m_destPolys;
- Path m_srcPoly;
- Path m_destPoly;
- std::vector<DoublePoint> m_normals;
- double m_delta, m_sinA, m_sin, m_cos;
- double m_miterLim, m_StepsPerRad;
- IntPoint m_lowest;
- PolyNode m_polyNodes;
-
- void FixOrientations();
- void DoOffset(double delta);
- void OffsetPoint(int j, int& k, JoinType jointype);
- void DoSquare(int j, int k);
- void DoMiter(int j, int k, double r);
- void DoRound(int j, int k);
-};
-//------------------------------------------------------------------------------
-
-class clipperException : public std::exception
-{
- public:
- clipperException(const char* description): m_descr(description) {}
- virtual ~clipperException() throw() {}
- virtual const char* what() const throw() {return m_descr.c_str();}
- private:
- std::string m_descr;
-};
-//------------------------------------------------------------------------------
-
-} //ClipperLib namespace
-
-#endif //clipper_hpp
-
-
diff --git a/include/csscolorparser/csscolorparser.hpp b/include/csscolorparser/csscolorparser.hpp
deleted file mode 100644
index 6caf796943..0000000000
--- a/include/csscolorparser/csscolorparser.hpp
+++ /dev/null
@@ -1,44 +0,0 @@
-// (c) Dean McNamee <dean@gmail.com>, 2012.
-// C++ port by Konstantin Käfer <mail@kkaefer.com>, 2014.
-//
-// https://github.com/deanm/css-color-parser-js
-// https://github.com/kkaefer/css-color-parser-cpp
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-// IN THE SOFTWARE.
-
-#ifndef CSS_COLOR_PARSER_CPP
-#define CSS_COLOR_PARSER_CPP
-
-#include <string>
-
-namespace CSSColorParser {
-
-struct Color {
- inline Color() {}
- inline Color(unsigned char r_, unsigned char g_, unsigned char b_, float a_)
- : r(r_), g(g_), b(b_), a(a_) {}
- unsigned char r = 0, g = 0, b = 0;
- float a = 1.0f;
-};
-
-Color parse(const std::string& css_str);
-
-}
-
-#endif
diff --git a/include/libtess2/LICENSE.txt b/include/libtess2/LICENSE.txt
deleted file mode 100644
index 30133655cf..0000000000
--- a/include/libtess2/LICENSE.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
-** Copyright (C) [dates of first publication] Silicon Graphics, Inc.
-** All Rights Reserved.
-**
-** Permission is hereby granted, free of charge, to any person obtaining a copy
-** of this software and associated documentation files (the "Software"), to deal
-** in the Software without restriction, including without limitation the rights
-** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-** of the Software, and to permit persons to whom the Software is furnished to do so,
-** subject to the following conditions:
-**
-** The above copyright notice including the dates of first publication and either this
-** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ shall be
-** included in all copies or substantial portions of the Software.
-**
-** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-** INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-** PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL SILICON GRAPHICS, INC.
-** BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
-** OR OTHER DEALINGS IN THE SOFTWARE.
-**
-** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not
-** be used in advertising or otherwise to promote the sale, use or other dealings in
-** this Software without prior written authorization from Silicon Graphics, Inc.
diff --git a/include/libtess2/tesselator.h b/include/libtess2/tesselator.h
deleted file mode 100755
index 74ca18e27d..0000000000
--- a/include/libtess2/tesselator.h
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
-** SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
-** Copyright (C) [dates of first publication] Silicon Graphics, Inc.
-** All Rights Reserved.
-**
-** Permission is hereby granted, free of charge, to any person obtaining a copy
-** of this software and associated documentation files (the "Software"), to deal
-** in the Software without restriction, including without limitation the rights
-** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-** of the Software, and to permit persons to whom the Software is furnished to do so,
-** subject to the following conditions:
-**
-** The above copyright notice including the dates of first publication and either this
-** permission notice or a reference to http://oss.sgi.com/projects/FreeB/ shall be
-** included in all copies or substantial portions of the Software.
-**
-** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-** INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-** PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL SILICON GRAPHICS, INC.
-** BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
-** OR OTHER DEALINGS IN THE SOFTWARE.
-**
-** Except as contained in this notice, the name of Silicon Graphics, Inc. shall not
-** be used in advertising or otherwise to promote the sale, use or other dealings in
-** this Software without prior written authorization from Silicon Graphics, Inc.
-*/
-/*
-** Author: Mikko Mononen, July 2009.
-*/
-
-#ifndef TESSELATOR_H
-#define TESSELATOR_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// See OpenGL Red Book for description of the winding rules
-// http://www.glprogramming.com/red/chapter11.html
-enum TessWindingRule
-{
- TESS_WINDING_ODD,
- TESS_WINDING_NONZERO,
- TESS_WINDING_POSITIVE,
- TESS_WINDING_NEGATIVE,
- TESS_WINDING_ABS_GEQ_TWO,
-};
-
-// The contents of the tessGetElements() depends on element type being passed to tessTesselate().
-// Tesselation result element types:
-// TESS_POLYGONS
-// Each element in the element array is polygon defined as 'polySize' number of vertex indices.
-// If a polygon has than 'polySize' vertices, the remaining indices are stored as TESS_UNDEF.
-// Example, drawing a polygon:
-// const int nelems = tessGetElementCount(tess);
-// const TESSindex* elems = tessGetElements(tess);
-// for (int i = 0; i < nelems; i++) {
-// const TESSindex* poly = &elems[i * polySize];
-// glBegin(GL_POLYGON);
-// for (int j = 0; j < polySize; j++) {
-// if (poly[j] == TESS_UNDEF) break;
-// glVertex2fv(&verts[poly[j]*vertexSize]);
-// }
-// glEnd();
-// }
-//
-// TESS_CONNECTED_POLYGONS
-// Each element in the element array is polygon defined as 'polySize' number of vertex indices,
-// followed by 'polySize' indices to neighour polygons, that is each element is 'polySize' * 2 indices.
-// If a polygon has than 'polySize' vertices, the remaining indices are stored as TESS_UNDEF.
-// If a polygon edge is a boundary, that is, not connected to another polygon, the neighbour index is TESS_UNDEF.
-// Example, flood fill based on seed polygon:
-// const int nelems = tessGetElementCount(tess);
-// const TESSindex* elems = tessGetElements(tess);
-// unsigned char* visited = (unsigned char*)calloc(nelems);
-// TESSindex stack[50];
-// int nstack = 0;
-// stack[nstack++] = seedPoly;
-// visited[startPoly] = 1;
-// while (nstack > 0) {
-// TESSindex idx = stack[--nstack];
-// const TESSindex* poly = &elems[idx * polySize * 2];
-// const TESSindex* nei = &poly[polySize];
-// for (int i = 0; i < polySize; i++) {
-// if (poly[i] == TESS_UNDEF) break;
-// if (nei[i] != TESS_UNDEF && !visited[nei[i]])
-// stack[nstack++] = nei[i];
-// visited[nei[i]] = 1;
-// }
-// }
-// }
-//
-// TESS_BOUNDARY_CONTOURS
-// Each element in the element array is [base index, count] pair defining a range of vertices for a contour.
-// The first value is index to first vertex in contour and the second value is number of vertices in the contour.
-// Example, drawing contours:
-// const int nelems = tessGetElementCount(tess);
-// const TESSindex* elems = tessGetElements(tess);
-// for (int i = 0; i < nelems; i++) {
-// const TESSindex base = elems[i * 2];
-// const TESSindex count = elems[i * 2 + 1];
-// glBegin(GL_LINE_LOOP);
-// for (int j = 0; j < count; j++) {
-// glVertex2fv(&verts[(base+count) * vertexSize]);
-// }
-// glEnd();
-// }
-//
-enum TessElementType
-{
- TESS_POLYGONS,
- TESS_CONNECTED_POLYGONS,
- TESS_BOUNDARY_CONTOURS,
-};
-
-typedef float TESSreal;
-typedef int TESSindex;
-typedef struct TESStesselator TESStesselator;
-typedef struct TESSalloc TESSalloc;
-
-#define TESS_UNDEF (~(TESSindex)0)
-
-// Custom memory allocator interface.
-// The internal memory allocator allocates mesh edges, vertices and faces
-// as well as dictionary nodes and active regions in buckets and uses simple
-// freelist to speed up the allocation. The bucket size should roughly match your
-// expected input data. For example if you process only hundreds of vertices,
-// a bucket size of 128 might be ok, where as when processing thousands of vertices
-// bucket size of 1024 might be approproate. The bucket size is a compromise between
-// how often to allocate memory from the system versus how much extra space the system
-// should allocate. Reasonable defaults are show in commects below, they will be used if
-// the bucket sizes are zero.
-//
-// The use may left the memrealloc to be null. In that case, the tesselator will not try to
-// dynamically grow int's internal arrays. The tesselator only needs the reallocation when it
-// has found intersecting segments and needs to add new vertex. This defency can be cured by
-// allocating some extra vertices beforehand. The 'extraVertices' variable allows to specify
-// number of expected extra vertices.
-struct TESSalloc
-{
- void *(*memalloc)( void *userData, unsigned int size );
- void *(*memrealloc)( void *userData, void* ptr, unsigned int size );
- void (*memfree)( void *userData, void *ptr );
- void* userData; // User data passed to the allocator functions.
- int meshEdgeBucketSize; // 512
- int meshVertexBucketSize; // 512
- int meshFaceBucketSize; // 256
- int dictNodeBucketSize; // 512
- int regionBucketSize; // 256
- int extraVertices; // Number of extra vertices allocated for the priority queue.
-};
-
-// tessNewTess() - Creates a new tesselator.
-// Use tessDeleteTess() to delete the tesselator.
-// Returns:
-// new tesselator object.
-TESStesselator* tessNewTess( TESSalloc* alloc );
-
-// tessDeleteTess() - Deletes a tesselator.
-// Parameters:
-// tess - pointer to tesselator object to be deleted.
-void tessDeleteTess( TESStesselator *tess );
-
-// tessAddContour() - Adds a contour to be tesselated.
-// The type of the vertex coordinates is assumed to be TESSreal.
-// Parameters:
-// tess - pointer to tesselator object.
-// size - number of coordinates per vertex. Must be 2 or 3.
-// pointer - pointer to the first coordinate of the first vertex in the array.
-// stride - defines offset in bytes between consecutive vertices.
-// count - number of vertices in contour.
-void tessAddContour( TESStesselator *tess, int size, const void* pointer, int stride, int count );
-
-// tessTesselate() - tesselate contours.
-// Parameters:
-// tess - pointer to tesselator object.
-// windingRule - winding rules used for tesselation, must be one of TessWindingRule.
-// elementType - defines the tesselation result element type, must be one of TessElementType.
-// polySize - defines maximum vertices per polygons if output is polygons.
-// vertexSize - defines the number of coordinates in tesselation result vertex, must be 2 or 3.
-// normal - defines the normal of the input contours, of null the normal is calculated automatically.
-// Returns:
-// 1 if succeed, 0 if failed.
-int tessTesselate( TESStesselator *tess, int windingRule, int elementType, int polySize, int vertexSize, const TESSreal* normal );
-
-// tessGetVertexCount() - Returns number of vertices in the tesselated output.
-int tessGetVertexCount( TESStesselator *tess );
-
-// tessGetVertices() - Returns pointer to first coordinate of first vertex.
-const TESSreal* tessGetVertices( TESStesselator *tess );
-
-// tessGetVertexIndices() - Returns pointer to first vertex index.
-// Vertex indices can be used to map the generated vertices to the original vertices.
-// Every point added using tessAddContour() will get a new index starting at 0.
-// New vertices generated at the intersections of segments are assigned value TESS_UNDEF.
-const TESSindex* tessGetVertexIndices( TESStesselator *tess );
-
-// tessGetElementCount() - Returns number of elements in the the tesselated output.
-int tessGetElementCount( TESStesselator *tess );
-
-// tessGetElements() - Returns pointer to the first element.
-const TESSindex* tessGetElements( TESStesselator *tess );
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // TESSELATOR_H
diff --git a/include/mbgl/geometry/anchor.hpp b/include/mbgl/geometry/anchor.hpp
deleted file mode 100644
index d30394f0b9..0000000000
--- a/include/mbgl/geometry/anchor.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef MBGL_GEOMETRY_ANCHOR
-#define MBGL_GEOMETRY_ANCHOR
-
-#include <vector>
-
-namespace mbgl {
-
-struct Anchor {
- float x = 0.0f;
- float y = 0.0f;
- float angle = 0.0f;
- float scale = 0.0f;
- int segment = -1;
-
- explicit Anchor(float x_, float y_, float angle_, float scale_)
- : x(x_), y(y_), angle(angle_), scale(scale_) {}
- explicit Anchor(float x_, float y_, float angle_, float scale_, int segment_)
- : x(x_), y(y_), angle(angle_), scale(scale_), segment(segment_) {}
-};
-
-typedef std::vector<Anchor> Anchors;
-
-}
-
-#endif \ No newline at end of file
diff --git a/include/mbgl/geometry/binpack.hpp b/include/mbgl/geometry/binpack.hpp
deleted file mode 100644
index 9aadaa202c..0000000000
--- a/include/mbgl/geometry/binpack.hpp
+++ /dev/null
@@ -1,100 +0,0 @@
-#ifndef MBGL_GEOMETRY_BINPACK
-#define MBGL_GEOMETRY_BINPACK
-
-#include <mbgl/util/noncopyable.hpp>
-#include <mbgl/util/rect.hpp>
-#include <cstdint>
-#include <list>
-
-namespace mbgl {
-
-template <typename T>
-class BinPack : private util::noncopyable {
-public:
- BinPack(T width, T height)
- : free(1, Rect<uint16_t>{ 0, 0, width, height }) {}
-public:
- Rect<T> allocate(T width, T height) {
- // Find the smallest free rect angle
- auto smallest = free.end();
- for (auto it = free.begin(); it != free.end(); ++it) {
- const Rect<T>& ref = *it;
- const Rect<T>& rect = *smallest;
- if (width <= ref.w && height <= ref.h) {
- if (smallest == free.end() || (ref.y <= rect.y && ref.x <= rect.x)) {
- smallest = it;
- }
- }
- }
-
- if (smallest == free.end()) {
- // There's no space left for this char.
- return Rect<uint16_t>{ 0, 0, 0, 0 };
- } else {
- Rect<T> rect = *smallest;
- free.erase(smallest);
-
- // Shorter/Longer Axis Split Rule (SAS)
- // http://clb.demon.fi/files/RectangleBinPack.pdf p. 15
- // Ignore the dimension of R and just split long the shorter dimension
- // See Also: http://www.cs.princeton.edu/~chazelle/pubs/blbinpacking.pdf
- if (rect.w < rect.h) {
- // split horizontally
- // +--+---+
- // |__|___| <-- b1
- // +------+ <-- b2
- if (rect.w > width) free.emplace_back(rect.x + width, rect.y, rect.w - width, height);
- if (rect.h > height) free.emplace_back(rect.x, rect.y + height, rect.w, rect.h - height);
- } else {
- // split vertically
- // +--+---+
- // |__| | <-- b1
- // +--|---+ <-- b2
- if (rect.w > width) free.emplace_back(rect.x + width, rect.y, rect.w - width, rect.h);
- if (rect.h > height) free.emplace_back(rect.x, rect.y + height, width, rect.h - height);
- }
-
- return Rect<uint16_t>{ rect.x, rect.y, width, height };
- }
- }
-
-
- void release(Rect<T> rect) {
- // Simple algorithm to recursively merge the newly released cell with its
- // neighbor. This doesn't merge more than two cells at a time, and fails
- // for complicated merges.
- for (auto it = free.begin(); it != free.end(); ++it) {
- Rect<T> ref = *it;
- if (ref.y == rect.y && ref.h == rect.h && ref.x + ref.w == rect.x) {
- ref.w += rect.w;
- }
- else if (ref.x == rect.x && ref.w == rect.w && ref.y + ref.h == rect.y) {
- ref.h += rect.h;
- }
- else if (rect.y == ref.y && rect.h == ref.h && rect.x + rect.w == ref.x) {
- ref.x = rect.x;
- ref.w += rect.w;
- }
- else if (rect.x == ref.x && rect.w == ref.w && rect.y + rect.h == ref.y) {
- ref.y = rect.y;
- ref.h += rect.h;
- } else {
- continue;
- }
-
- free.erase(it);
- release(ref);
- return;
-
- }
-
- free.emplace_back(rect);
- };
-
-private:
- std::list<Rect<T>> free;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/geometry/buffer.hpp b/include/mbgl/geometry/buffer.hpp
deleted file mode 100644
index 80cc6b9d1a..0000000000
--- a/include/mbgl/geometry/buffer.hpp
+++ /dev/null
@@ -1,118 +0,0 @@
-#ifndef MBGL_GEOMETRY_BUFFER
-#define MBGL_GEOMETRY_BUFFER
-
-#include <mbgl/platform/gl.hpp>
-#include <mbgl/util/noncopyable.hpp>
-
-#include <cstdlib>
-#include <cassert>
-#include <stdexcept>
-
-namespace mbgl {
-
-template <
- size_t item_size,
- int bufferType = GL_ARRAY_BUFFER,
- size_t defaultLength = 8192,
- bool retainAfterUpload = false
->
-class Buffer : private util::noncopyable {
-public:
- ~Buffer() {
- cleanup();
- if (buffer != 0) {
- glDeleteBuffers(1, &buffer);
- buffer = 0;
- }
- }
-
- // Returns the number of elements in this buffer. This is not the number of
- // bytes, but rather the number of coordinates with associated information.
- inline size_t index() const {
- return pos / itemSize;
- }
-
- inline bool empty() const {
- return pos == 0;
- }
-
- // Transfers this buffer to the GPU and binds the buffer to the GL context.
- void bind(bool force = false) {
- if (buffer == 0) {
- glGenBuffers(1, &buffer);
- force = true;
- }
- glBindBuffer(bufferType, buffer);
- if (force) {
- if (array == nullptr) {
- throw std::runtime_error("Buffer was already deleted or doesn't contain elements");
- }
-
- glBufferData(bufferType, pos, array, GL_STATIC_DRAW);
- if (!retainAfterUpload) {
- cleanup();
- }
- }
- }
-
- void cleanup() {
- if (array) {
- free(array);
- array = nullptr;
- }
- }
-
- inline GLuint getID() const {
- return buffer;
- }
-
-protected:
- // increase the buffer size by at least /required/ bytes.
- inline void *addElement() {
- if (buffer != 0) {
- throw std::runtime_error("Can't add elements after buffer was bound to GPU");
- }
- if (length < pos + itemSize) {
- while (length < pos + itemSize) length += defaultLength;
- array = realloc(array, length);
- if (array == nullptr) {
- throw std::runtime_error("Buffer reallocation failed");
- }
- }
- pos += itemSize;
- return static_cast<char *>(array) + (pos - itemSize);
- }
-
- // Get a pointer to the item at a given index.
- inline void *getElement(size_t i) {
- if (array == nullptr) {
- throw std::runtime_error("Buffer was already deleted or doesn't contain elements");
- }
-
- if (i * itemSize >= pos) {
- throw new std::runtime_error("Can't get element after array bounds");
- } else {
- return static_cast<char *>(array) + (i * itemSize);
- }
- }
-
-public:
- static const size_t itemSize = item_size;
-
-private:
- // CPU buffer
- void *array = nullptr;
-
- // Byte position where we are writing.
- size_t pos = 0;
-
- // Number of bytes that are valid in this buffer.
- size_t length = 0;
-
- // GL buffer ID
- GLuint buffer = 0;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/geometry/debug_font_buffer.hpp b/include/mbgl/geometry/debug_font_buffer.hpp
deleted file mode 100644
index 7cceb0f576..0000000000
--- a/include/mbgl/geometry/debug_font_buffer.hpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef MBGL_GEOMETRY_DEBUG_FONT_BUFFER
-#define MBGL_GEOMETRY_DEBUG_FONT_BUFFER
-
-#include "buffer.hpp"
-
-namespace mbgl {
-
-class DebugFontBuffer : public Buffer<
- 4 // 2 bytes per coordinate, 2 coordinates
-> {
-public:
- void addText(const char *text, double left, double baseline, double scale = 1);
-};
-
-}
-
-#endif
diff --git a/include/mbgl/geometry/elements_buffer.hpp b/include/mbgl/geometry/elements_buffer.hpp
deleted file mode 100644
index 045560f9aa..0000000000
--- a/include/mbgl/geometry/elements_buffer.hpp
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef MBGL_GEOMETRY_TRIANGLE_ELEMENTS_BUFFER
-#define MBGL_GEOMETRY_TRIANGLE_ELEMENTS_BUFFER
-
-#include <mbgl/geometry/buffer.hpp>
-#include <mbgl/geometry/vao.hpp>
-#include <mbgl/util/noncopyable.hpp>
-
-#include <array>
-
-namespace mbgl {
-
-template <int count>
-struct ElementGroup : public util::noncopyable {
- std::array<VertexArrayObject, count> array;
- uint32_t vertex_length;
- uint32_t elements_length;
-
- ElementGroup() : vertex_length(0), elements_length(0) {}
- ElementGroup(uint32_t vertex_length_, uint32_t elements_length_)
- : vertex_length(vertex_length_),
- elements_length(elements_length_) {
- }
-
- ElementGroup(ElementGroup &&rhs) noexcept
- : array(std::move(rhs.array)),
- vertex_length(rhs.vertex_length),
- elements_length(rhs.elements_length) {};
-};
-
-class TriangleElementsBuffer : public Buffer<
- 6, // bytes per triangle (3 * unsigned short == 6 bytes)
- GL_ELEMENT_ARRAY_BUFFER
-> {
-public:
- typedef uint16_t element_type;
-
- void add(element_type a, element_type b, element_type c);
-};
-
-
-class LineElementsBuffer : public Buffer<
- 4, // bytes per triangle (2 * unsigned short == 6 bytes)
- GL_ELEMENT_ARRAY_BUFFER
-> {
-public:
- typedef uint16_t element_type;
-
- void add(element_type a, element_type b);
-};
-
-class PointElementsBuffer : public Buffer<
- 2, // bytes per point (1 unsigned short)
- GL_ELEMENT_ARRAY_BUFFER
-> {
-public:
- typedef uint16_t element_type;
-
- void add(element_type a);
-};
-
-}
-
-#endif
diff --git a/include/mbgl/geometry/fill_buffer.hpp b/include/mbgl/geometry/fill_buffer.hpp
deleted file mode 100644
index 4a3d5a5b38..0000000000
--- a/include/mbgl/geometry/fill_buffer.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef MBGL_GEOMETRY_FILL_BUFFER
-#define MBGL_GEOMETRY_FILL_BUFFER
-
-#include "buffer.hpp"
-#include <vector>
-#include <cstdint>
-
-namespace mbgl {
-
-class FillVertexBuffer : public Buffer<
- 4 // bytes per coordinates (2 * unsigned short == 4 bytes)
-> {
-public:
- typedef int16_t vertex_type;
-
- void add(vertex_type x, vertex_type y);
-};
-
-}
-
-#endif
diff --git a/include/mbgl/geometry/geometry.hpp b/include/mbgl/geometry/geometry.hpp
deleted file mode 100644
index 484d17b36d..0000000000
--- a/include/mbgl/geometry/geometry.hpp
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef MBGL_GEOMETRY_GEOMETRY
-#define MBGL_GEOMETRY_GEOMETRY
-
-#include <mbgl/util/pbf.hpp>
-#include <mbgl/util/noncopyable.hpp>
-
-#include <cstdlib>
-
-namespace mbgl {
-
-class Geometry : private util::noncopyable {
-
-public:
- inline explicit Geometry(pbf& data);
-
- enum command : uint8_t {
- end = 0,
- move_to = 1,
- line_to = 2,
- close = 7
- };
-
- inline command next(int32_t &rx, int32_t &ry);
-
-private:
- pbf& data;
- uint8_t cmd;
- uint32_t length;
- int32_t x, y;
- int32_t ox, oy;
-};
-
-Geometry::Geometry(pbf& data_)
- : data(data_),
- cmd(1),
- length(0),
- x(0), y(0),
- ox(0), oy(0) {}
-
-Geometry::command Geometry::next(int32_t &rx, int32_t &ry) {
- if (data.data < data.end) {
- if (length == 0) {
- uint32_t cmd_length = static_cast<uint32_t>(data.varint());
- cmd = cmd_length & 0x7;
- length = cmd_length >> 3;
- }
-
- --length;
-
- if (cmd == move_to || cmd == line_to) {
- rx = (x += data.svarint());
- ry = (y += data.svarint());
-
- if (cmd == move_to) {
- ox = x;
- oy = y;
- return move_to;
- } else {
- return line_to;
- }
- } else if (cmd == close) {
- rx = ox;
- ry = oy;
- return close;
- } else {
- fprintf(stderr, "unknown command: %d\n", cmd);
- // TODO: gracefully handle geometry parse failures
- return end;
- }
- } else {
- return end;
- }
-}
-
-}
-
-#endif
diff --git a/include/mbgl/geometry/glyph_atlas.hpp b/include/mbgl/geometry/glyph_atlas.hpp
deleted file mode 100644
index 7b3c223fe5..0000000000
--- a/include/mbgl/geometry/glyph_atlas.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef MBGL_GEOMETRY_GLYPH_ATLAS
-#define MBGL_GEOMETRY_GLYPH_ATLAS
-
-#include <mbgl/geometry/binpack.hpp>
-#include <mbgl/text/glyph_store.hpp>
-#include <mbgl/util/noncopyable.hpp>
-
-#include <string>
-#include <set>
-#include <map>
-#include <mutex>
-#include <atomic>
-
-namespace mbgl {
-
-class GlyphAtlas : public util::noncopyable {
-public:
-
-private:
- struct GlyphValue {
- GlyphValue(const Rect<uint16_t>& rect_, uint64_t id)
- : rect(rect_), ids({ id }) {}
- Rect<uint16_t> rect;
- std::set<uint64_t> ids;
- };
-
- Rect<uint16_t> addGlyph_impl(uint64_t tile_id, const std::string& face_name,
- const SDFGlyph& glyph);
-public:
- GlyphAtlas(uint16_t width, uint16_t height);
-
- Rect<uint16_t> addGlyph(uint64_t tile_id, const std::string& face_name,
- const SDFGlyph& glyph);
- void addGlyphs(uint64_t tileid, std::u32string const& text, std::string const& stackname,
- FontStack const& fontStack, GlyphPositions & face);
- void removeGlyphs(uint64_t tile_id);
- void bind();
-
-public:
- const uint16_t width = 0;
- const uint16_t height = 0;
-
-private:
- std::mutex mtx;
- BinPack<uint16_t> bin;
- std::map<std::string, std::map<uint32_t, GlyphValue>> index;
- std::unique_ptr<char[]> data;
- std::atomic<bool> dirty;
- uint32_t texture = 0;
-};
-
-};
-
-#endif
diff --git a/include/mbgl/geometry/icon_buffer.hpp b/include/mbgl/geometry/icon_buffer.hpp
deleted file mode 100644
index e7e5f40355..0000000000
--- a/include/mbgl/geometry/icon_buffer.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef MBGL_GEOMETRY_ICON_BUFFER
-#define MBGL_GEOMETRY_ICON_BUFFER
-
-#include "buffer.hpp"
-
-#include <array>
-
-namespace mbgl {
-
- class IconVertexBuffer : public Buffer<
- 20
- > {
- public:
- static const double angleFactor;
-
- size_t add(int16_t x, int16_t y, float ox, float oy, int16_t tx, int16_t ty, float angle, float minzoom, std::array<float, 2> range, float maxzoom, float labelminzoom);
-
- };
-
-}
-
-#endif
diff --git a/include/mbgl/geometry/line_buffer.hpp b/include/mbgl/geometry/line_buffer.hpp
deleted file mode 100644
index 5012bb12ac..0000000000
--- a/include/mbgl/geometry/line_buffer.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef MBGL_GEOMETRY_LINE_BUFFER
-#define MBGL_GEOMETRY_LINE_BUFFER
-
-#include "buffer.hpp"
-
-namespace mbgl {
-
-class LineVertexBuffer : public Buffer<
- 8 // 2 coordinates per vertex + 1 linesofar + 1 extrude coord pair == 4 (== 8 bytes)
-> {
-public:
- typedef int16_t vertex_type;
-
- /*
- * Scale the extrusion vector so that the normal length is this value.
- * Contains the "texture" normals (-1..1). This is distinct from the extrude
- * normals for line joins, because the x-value remains 0 for the texture
- * normal array, while the extrude normal actually moves the vertex to create
- * the acute/bevelled line join.
- */
- static const int8_t extrudeScale = 63;
-
- /*
- * Add a vertex to this buffer
- *
- * @param {number} x vertex position
- * @param {number} y vertex position
- * @param {number} ex extrude normal
- * @param {number} ey extrude normal
- * @param {number} tx texture normal
- * @param {number} ty texture normal
- */
- size_t add(vertex_type x, vertex_type y, float ex, float ey, int8_t tx, int8_t ty, int32_t linesofar = 0);
-};
-
-
-}
-
-#endif
diff --git a/include/mbgl/geometry/resample.hpp b/include/mbgl/geometry/resample.hpp
deleted file mode 100644
index bcfe4ca53d..0000000000
--- a/include/mbgl/geometry/resample.hpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef MBGL_GEOMETRY_INTERPOLATE
-#define MBGL_GEOMETRY_INTERPOLATE
-
-#include <mbgl/geometry/anchor.hpp>
-#include <mbgl/util/math.hpp>
-
-namespace mbgl {
-
-Anchors resample(const std::vector<Coordinate> &vertices, float spacing,
- float minScale, float maxScale, float tilePixelRatio, int start = 0);
-}
-
-#endif
diff --git a/include/mbgl/geometry/sprite_atlas.hpp b/include/mbgl/geometry/sprite_atlas.hpp
deleted file mode 100644
index 9fb42a30b5..0000000000
--- a/include/mbgl/geometry/sprite_atlas.hpp
+++ /dev/null
@@ -1,81 +0,0 @@
-#ifndef MBGL_GEOMETRY_SPRITE_ATLAS
-#define MBGL_GEOMETRY_SPRITE_ATLAS
-
-#include <mbgl/geometry/binpack.hpp>
-#include <mbgl/util/noncopyable.hpp>
-#include <mbgl/util/ptr.hpp>
-
-#include <string>
-#include <map>
-#include <mutex>
-#include <atomic>
-#include <set>
-#include <array>
-
-namespace mbgl {
-
-class Sprite;
-class SpritePosition;
-
-struct SpriteAtlasPosition {
- std::array<float, 2> size;
- std::array<float, 2> tl;
- std::array<float, 2> br;
-};
-
-class SpriteAtlas : public util::noncopyable {
-public:
- typedef uint16_t dimension;
-
- // Add way to construct this from another SpriteAtlas (e.g. with another pixelRatio)
- SpriteAtlas(dimension width, dimension height);
- ~SpriteAtlas();
-
- // Changes the pixel ratio.
- bool resize(float newRatio);
-
- // Changes the source sprite.
- void setSprite(util::ptr<Sprite> sprite);
-
- // Returns the coordinates of an image that is sourced from the sprite image.
- // This getter attempts to read the image from the sprite if it is already loaded.
- // In that case, it copies it into the sprite atlas and returns the dimensions.
- // Otherwise, it returns a 0/0/0/0 rect.
- Rect<dimension> getImage(const std::string& name);
-
- SpriteAtlasPosition getPosition(const std::string& name, bool repeating = false);
-
- // Binds the image buffer of this sprite atlas to the GPU, and uploads data if it is out
- // of date.
- void bind(bool linear = false);
-
- inline float getWidth() const { return width; }
- inline float getHeight() const { return height; }
- inline float getTextureWidth() const { return width * pixelRatio; }
- inline float getTextureHeight() const { return height * pixelRatio; }
- inline float getPixelRatio() const { return pixelRatio; }
-
- const dimension width = 0;
- const dimension height = 0;
-
-private:
- void allocate();
- Rect<SpriteAtlas::dimension> allocateImage(size_t width, size_t height);
- void copy(const Rect<dimension>& dst, const SpritePosition& src);
-
- std::recursive_mutex mtx;
- float pixelRatio = 1.0f;
- BinPack<dimension> bin;
- util::ptr<Sprite> sprite;
- std::map<std::string, Rect<dimension>> images;
- std::set<std::string> uninitialized;
- uint32_t *data = nullptr;
- std::atomic<bool> dirty;
- uint32_t texture = 0;
- uint32_t filter = 0;
- static const int buffer = 1;
-};
-
-};
-
-#endif
diff --git a/include/mbgl/geometry/static_vertex_buffer.hpp b/include/mbgl/geometry/static_vertex_buffer.hpp
deleted file mode 100644
index ce932269f0..0000000000
--- a/include/mbgl/geometry/static_vertex_buffer.hpp
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef MBGL_GEOMETRY_STATIC_VERTEX_BUFFER
-#define MBGL_GEOMETRY_STATIC_VERTEX_BUFFER
-
-#include <mbgl/geometry/buffer.hpp>
-
-#include <vector>
-#include <cstddef>
-#include <cstdint>
-#include <cmath>
-
-namespace mbgl {
-
-class StaticVertexBuffer : public Buffer<
- 4, // bytes per vertex (2 * signed short == 4 bytes)
- GL_ARRAY_BUFFER,
- 32 // default length
-> {
-public:
- typedef int16_t vertex_type;
-
- StaticVertexBuffer(std::initializer_list<std::pair<int16_t, int16_t>> init);
-};
-
-}
-
-#endif
diff --git a/include/mbgl/geometry/text_buffer.hpp b/include/mbgl/geometry/text_buffer.hpp
deleted file mode 100644
index 159f3207a8..0000000000
--- a/include/mbgl/geometry/text_buffer.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef MBGL_GEOMETRY_TEXT_BUFFER
-#define MBGL_GEOMETRY_TEXT_BUFFER
-
-#include "buffer.hpp"
-#include <array>
-
-namespace mbgl {
-
-class TextVertexBuffer : public Buffer <
- 16,
- GL_ARRAY_BUFFER,
- 32768
-> {
-public:
- typedef int16_t vertex_type;
-
- static const double angleFactor;
-
- size_t add(int16_t x, int16_t y, float ox, float oy, uint16_t tx, uint16_t ty, float angle, float minzoom, std::array<float, 2> range, float maxzoom, float labelminzoom);
-};
-
-
-}
-
-#endif
diff --git a/include/mbgl/geometry/vao.hpp b/include/mbgl/geometry/vao.hpp
deleted file mode 100644
index 2ecba731f7..0000000000
--- a/include/mbgl/geometry/vao.hpp
+++ /dev/null
@@ -1,73 +0,0 @@
-#ifndef MBGL_GEOMETRY_VAO
-#define MBGL_GEOMETRY_VAO
-
-#include <mbgl/shader/shader.hpp>
-#include <mbgl/platform/gl.hpp>
-#include <mbgl/util/noncopyable.hpp>
-
-#include <stdexcept>
-
-namespace mbgl {
-
-class VertexArrayObject : public util::noncopyable {
-public:
- inline VertexArrayObject() {};
-
- inline VertexArrayObject(VertexArrayObject &&rhs) noexcept
- : vao(rhs.vao),
- bound_shader(rhs.bound_shader),
- bound_shader_name(rhs.bound_shader_name),
- bound_vertex_buffer(rhs.bound_vertex_buffer),
- bound_elements_buffer(rhs.bound_elements_buffer),
- bound_offset(rhs.bound_offset) {};
-
- template <typename Shader, typename VertexBuffer>
- inline void bind(Shader& shader, VertexBuffer &vertexBuffer, char *offset) {
- bindVertexArrayObject();
- if (bound_shader == 0) {
- vertexBuffer.bind();
- shader.bind(offset);
- if (vao) {
- storeBinding(shader, vertexBuffer.getID(), 0, offset);
- }
- } else {
- verifyBinding(shader, vertexBuffer.getID(), 0, offset);
- }
- }
-
- template <typename Shader, typename VertexBuffer, typename ElementsBuffer>
- inline void bind(Shader& shader, VertexBuffer &vertexBuffer, ElementsBuffer &elementsBuffer, char *offset) {
- bindVertexArrayObject();
- if (bound_shader == 0) {
- vertexBuffer.bind();
- elementsBuffer.bind();
- shader.bind(offset);
- if (vao) {
- storeBinding(shader, vertexBuffer.getID(), elementsBuffer.getID(), offset);
- }
- } else {
- verifyBinding(shader, vertexBuffer.getID(), elementsBuffer.getID(), offset);
- }
- }
-
- ~VertexArrayObject();
-
-private:
- void bindVertexArrayObject();
- void storeBinding(Shader &shader, GLuint vertexBuffer, GLuint elementsBuffer, char *offset);
- void verifyBinding(Shader &shader, GLuint vertexBuffer, GLuint elementsBuffer, char *offset);
-
- GLuint vao = 0;
-
- // For debug reasons, we're storing the bind information so that we can
- // detect errors and report
- GLuint bound_shader = 0;
- const char *bound_shader_name = "";
- GLuint bound_vertex_buffer = 0;
- GLuint bound_elements_buffer = 0;
- char *bound_offset = 0;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp
index 4e6eef89cf..3a50a70136 100644
--- a/include/mbgl/map/map.hpp
+++ b/include/mbgl/map/map.hpp
@@ -2,9 +2,6 @@
#define MBGL_MAP_MAP
#include <mbgl/map/transform.hpp>
-#include <mbgl/renderer/painter.hpp>
-#include <mbgl/geometry/glyph_atlas.hpp>
-#include <mbgl/geometry/sprite_atlas.hpp>
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/util/time.hpp>
#include <mbgl/util/uv.hpp>
@@ -19,6 +16,7 @@
namespace mbgl {
+class Painter;
class GlyphStore;
class LayerDescription;
class Sprite;
@@ -29,6 +27,8 @@ class StyleSource;
class TexturePool;
class FileSource;
class View;
+class GlyphAtlas;
+class SpriteAtlas;
class Map : private util::noncopyable {
typedef void (*stop_callback)(void *);
@@ -182,13 +182,13 @@ private:
FileSource& fileSource;
util::ptr<Style> style;
- GlyphAtlas glyphAtlas;
+ const std::unique_ptr<GlyphAtlas> glyphAtlas;
util::ptr<GlyphStore> glyphStore;
- SpriteAtlas spriteAtlas;
+ const std::unique_ptr<SpriteAtlas> spriteAtlas;
util::ptr<Sprite> sprite;
util::ptr<TexturePool> texturePool;
- Painter painter;
+ const std::unique_ptr<Painter> painter;
std::string styleURL;
std::string styleJSON = "";
diff --git a/include/mbgl/map/raster_tile_data.hpp b/include/mbgl/map/raster_tile_data.hpp
deleted file mode 100644
index 42070d9c61..0000000000
--- a/include/mbgl/map/raster_tile_data.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef MBGL_MAP_RASTER_TILE_DATA
-#define MBGL_MAP_RASTER_TILE_DATA
-
-#include <mbgl/map/tile.hpp>
-#include <mbgl/map/tile_data.hpp>
-#include <mbgl/renderer/raster_bucket.hpp>
-
-namespace mbgl {
-
-class Painter;
-class SourceInfo;
-class StyleLayer;
-class TexturePool;
-
-class RasterTileData : public TileData {
- friend class TileParser;
-
-public:
- RasterTileData(Tile::ID const& id, TexturePool&, const SourceInfo&);
- ~RasterTileData();
-
- virtual void parse();
- virtual void render(Painter &painter, util::ptr<StyleLayer> layer_desc, const mat4 &matrix);
- virtual bool hasData(StyleLayer const& layer_desc) const;
-
-protected:
- StyleBucketRaster properties;
- RasterBucket bucket;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/map/source.hpp b/include/mbgl/map/source.hpp
deleted file mode 100644
index 8976f67b05..0000000000
--- a/include/mbgl/map/source.hpp
+++ /dev/null
@@ -1,86 +0,0 @@
-#ifndef MBGL_MAP_SOURCE
-#define MBGL_MAP_SOURCE
-
-#include <mbgl/map/tile.hpp>
-#include <mbgl/map/tile_data.hpp>
-#include <mbgl/style/style_source.hpp>
-
-#include <mbgl/util/noncopyable.hpp>
-#include <mbgl/util/time.hpp>
-#include <mbgl/util/mat4.hpp>
-#include <mbgl/util/ptr.hpp>
-
-#include <cstdint>
-#include <forward_list>
-#include <iosfwd>
-#include <map>
-
-namespace mbgl {
-
-class Map;
-class GlyphAtlas;
-class GlyphStore;
-class SpriteAtlas;
-class Sprite;
-class FileSource;
-class TexturePool;
-class Style;
-class Painter;
-class StyleLayer;
-class TransformState;
-struct box;
-
-class Source : public std::enable_shared_from_this<Source>, private util::noncopyable {
-public:
- Source(SourceInfo&);
-
- void load(Map&, FileSource&);
- void update(Map&, uv::worker&,
- util::ptr<Style>,
- GlyphAtlas&, GlyphStore&,
- SpriteAtlas&, util::ptr<Sprite>,
- TexturePool&, FileSource&,
- std::function<void ()> callback);
-
- void updateMatrices(const mat4 &projMatrix, const TransformState &transform);
- void drawClippingMasks(Painter &painter);
- size_t getTileCount() const;
- void render(Painter &painter, util::ptr<StyleLayer> layer_desc);
- void render(Painter &painter, util::ptr<StyleLayer> layer_desc, const Tile::ID &id, const mat4 &matrix);
- void finishRender(Painter &painter);
-
- std::forward_list<Tile::ID> getIDs() const;
- std::forward_list<Tile *> getLoadedTiles() const;
- void updateClipIDs(const std::map<Tile::ID, ClipID> &mapping);
-
-private:
- bool findLoadedChildren(const Tile::ID& id, int32_t maxCoveringZoom, std::forward_list<Tile::ID>& retain);
- bool findLoadedParent(const Tile::ID& id, int32_t minCoveringZoom, std::forward_list<Tile::ID>& retain);
- int32_t coveringZoomLevel(const TransformState&) const;
- std::forward_list<Tile::ID> coveringTiles(const TransformState&) const;
-
- TileData::State addTile(Map&, uv::worker&,
- util::ptr<Style>,
- GlyphAtlas&, GlyphStore&,
- SpriteAtlas&, util::ptr<Sprite>,
- FileSource&, TexturePool&,
- const Tile::ID&,
- std::function<void ()> callback);
-
- TileData::State hasTile(const Tile::ID& id);
-
- double getZoom(const TransformState &state) const;
-
- SourceInfo& info;
- bool loaded = false;
-
- // Stores the time when this source was most recently updated.
- timestamp updated = 0;
-
- std::map<Tile::ID, std::unique_ptr<Tile>> tiles;
- std::map<Tile::ID, std::weak_ptr<TileData>> tile_data;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/map/sprite.hpp b/include/mbgl/map/sprite.hpp
deleted file mode 100644
index d4b54ba1b5..0000000000
--- a/include/mbgl/map/sprite.hpp
+++ /dev/null
@@ -1,79 +0,0 @@
-#ifndef MBGL_STYLE_SPRITE
-#define MBGL_STYLE_SPRITE
-
-#include <mbgl/util/image.hpp>
-#include <mbgl/util/noncopyable.hpp>
-#include <mbgl/util/ptr.hpp>
-
-#include <cstdint>
-#include <atomic>
-#include <iosfwd>
-#include <string>
-#include <unordered_map>
-#include <future>
-
-namespace mbgl {
-
-class FileSource;
-
-class SpritePosition {
-public:
- explicit SpritePosition() {}
- explicit SpritePosition(uint16_t x, uint16_t y, uint16_t width, uint16_t height, float pixelRatio, bool sdf);
-
- operator bool() const {
- return !(width == 0 && height == 0 && x == 0 && y == 0);
- }
-
- uint16_t x = 0, y = 0;
- uint16_t width = 0, height = 0;
- float pixelRatio = 1.0f;
- bool sdf = false;
-};
-
-class Sprite : public std::enable_shared_from_this<Sprite>, private util::noncopyable {
-private:
- struct Key {};
- void load(FileSource& fileSource);
-
-public:
- Sprite(const Key &, const std::string& base_url, float pixelRatio);
- static util::ptr<Sprite> Create(const std::string& base_url, float pixelRatio, FileSource& fileSource);
-
- const SpritePosition &getSpritePosition(const std::string& name) const;
-
- void waitUntilLoaded() const;
- bool isLoaded() const;
-
- operator bool() const;
-
-private:
- const bool valid;
-
-public:
- const float pixelRatio;
- const std::string spriteURL;
- const std::string jsonURL;
- std::unique_ptr<util::Image> raster;
-
-private:
- void parseJSON();
- void parseImage();
- void complete();
-
-private:
- std::string body;
- std::string image;
- std::atomic<bool> loadedImage;
- std::atomic<bool> loadedJSON;
- std::unordered_map<std::string, SpritePosition> pos;
- const SpritePosition empty;
-
- std::promise<void> promise;
- std::future<void> future;
-
-};
-
-}
-
-#endif
diff --git a/include/mbgl/map/tile_data.hpp b/include/mbgl/map/tile_data.hpp
deleted file mode 100644
index 1ae215b204..0000000000
--- a/include/mbgl/map/tile_data.hpp
+++ /dev/null
@@ -1,88 +0,0 @@
-#ifndef MBGL_MAP_TILE_DATA
-#define MBGL_MAP_TILE_DATA
-
-#include <mbgl/map/tile.hpp>
-#include <mbgl/renderer/debug_bucket.hpp>
-#include <mbgl/geometry/debug_font_buffer.hpp>
-
-#include <mbgl/util/noncopyable.hpp>
-#include <mbgl/util/ptr.hpp>
-
-#include <atomic>
-#include <exception>
-#include <iosfwd>
-#include <string>
-#include <functional>
-
-namespace uv {
-class worker;
-}
-
-namespace mbgl {
-
-class Map;
-class FileSource;
-class Painter;
-class SourceInfo;
-class StyleLayer;
-class Request;
-
-class TileData : public std::enable_shared_from_this<TileData>,
- private util::noncopyable {
-public:
- struct exception : std::exception {};
- struct geometry_too_long_exception : exception {};
-
-public:
- typedef util::ptr<TileData> Ptr;
-
- enum class State {
- invalid,
- initial,
- loading,
- loaded,
- parsed,
- obsolete
- };
-
-public:
- TileData(Tile::ID const& id, const SourceInfo&);
- ~TileData();
-
- void request(uv::worker&, FileSource&, float pixelRatio, std::function<void ()> callback);
- void reparse(uv::worker&, std::function<void ()> callback);
- void cancel();
- const std::string toString() const;
-
- inline bool ready() const {
- return state == State::parsed;
- }
-
- // Override this in the child class.
- virtual void parse() = 0;
- virtual void render(Painter &painter, util::ptr<StyleLayer> layer_desc, const mat4 &matrix) = 0;
- virtual bool hasData(StyleLayer const& layer_desc) const = 0;
-
-
-public:
- const Tile::ID id;
- const std::string name;
- std::atomic<State> state;
-
-public:
- const SourceInfo& source;
-
-protected:
- std::unique_ptr<Request> req;
- std::string data;
-
- // Contains the tile ID string for painting debug information.
- DebugFontBuffer debugFontBuffer;
-
-public:
- DebugBucket debugBucket;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/map/tile_parser.hpp b/include/mbgl/map/tile_parser.hpp
deleted file mode 100644
index beae3af831..0000000000
--- a/include/mbgl/map/tile_parser.hpp
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef MBGL_MAP_TILE_PARSER
-#define MBGL_MAP_TILE_PARSER
-
-#include <mbgl/map/vector_tile.hpp>
-#include <mbgl/style/filter_expression.hpp>
-#include <mbgl/text/glyph.hpp>
-#include <mbgl/util/ptr.hpp>
-#include <mbgl/util/noncopyable.hpp>
-#include <cstdint>
-#include <iosfwd>
-#include <string>
-
-namespace mbgl {
-
-class Bucket;
-class TexturePool;
-class FontStack;
-class GlyphAtlas;
-class GlyphStore;
-class SpriteAtlas;
-class Sprite;
-class Style;
-class StyleBucket;
-class StyleBucketFill;
-class StyleBucketRaster;
-class StyleBucketLine;
-class StyleBucketSymbol;
-class StyleLayerGroup;
-class VectorTileData;
-class Collision;
-class TexturePool;
-
-class TileParser : private util::noncopyable
-{
-public:
- TileParser(const std::string &data, VectorTileData &tile,
- const util::ptr<const Style> &style,
- GlyphAtlas & glyphAtlas,
- GlyphStore & glyphStore,
- SpriteAtlas & spriteAtlas,
- const util::ptr<Sprite> &sprite,
- TexturePool& texturePool);
- ~TileParser();
-
-public:
- void parse();
-
-private:
- bool obsolete() const;
- void parseStyleLayers(util::ptr<StyleLayerGroup> group);
- std::unique_ptr<Bucket> createBucket(util::ptr<StyleBucket> bucket_desc);
-
- std::unique_ptr<Bucket> createFillBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketFill &fill);
- std::unique_ptr<Bucket> createRasterBucket(const StyleBucketRaster &raster);
- std::unique_ptr<Bucket> createLineBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketLine &line);
- std::unique_ptr<Bucket> createSymbolBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketSymbol &symbol);
-
- template <class Bucket> void addBucketGeometries(Bucket& bucket, const VectorTileLayer& layer, const FilterExpression &filter);
-
-private:
- const VectorTile vector_data;
- VectorTileData& tile;
-
- // Cross-thread shared data.
- util::ptr<const Style> style;
- GlyphAtlas & glyphAtlas;
- GlyphStore & glyphStore;
- SpriteAtlas & spriteAtlas;
- util::ptr<Sprite> sprite;
- TexturePool& texturePool;
-
- std::unique_ptr<Collision> collision;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/map/transform_state.hpp b/include/mbgl/map/transform_state.hpp
index bb330c1019..6dc34bd873 100644
--- a/include/mbgl/map/transform_state.hpp
+++ b/include/mbgl/map/transform_state.hpp
@@ -4,7 +4,6 @@
#include <mbgl/map/tile.hpp>
#include <mbgl/util/mat4.hpp>
-#include <mbgl/util/vec.hpp>
#include <cstdint>
#include <array>
diff --git a/include/mbgl/map/vector_tile.hpp b/include/mbgl/map/vector_tile.hpp
deleted file mode 100644
index 2d02ba3a0b..0000000000
--- a/include/mbgl/map/vector_tile.hpp
+++ /dev/null
@@ -1,118 +0,0 @@
-#ifndef MBGL_MAP_VECTOR_TILE
-#define MBGL_MAP_VECTOR_TILE
-
-#include <mbgl/style/filter_expression.hpp>
-#include <mbgl/style/value.hpp>
-#include <mbgl/text/glyph.hpp>
-#include <mbgl/util/pbf.hpp>
-#include <mbgl/util/optional.hpp>
-
-#include <cstdint>
-#include <iosfwd>
-#include <map>
-#include <string>
-#include <unordered_map>
-#include <vector>
-
-namespace mbgl {
-
-class VectorTileLayer;
-
-enum class FeatureType {
- Unknown = 0,
- Point = 1,
- LineString = 2,
- Polygon = 3
-};
-
-std::ostream& operator<<(std::ostream&, const FeatureType& type);
-
-class VectorTileFeature {
-public:
- VectorTileFeature(pbf feature, const VectorTileLayer& layer);
-
- uint64_t id = 0;
- FeatureType type = FeatureType::Unknown;
- std::map<std::string, Value> properties;
- pbf geometry;
-};
-
-std::ostream& operator<<(std::ostream&, const VectorTileFeature& feature);
-
-
-class VectorTileTagExtractor {
-public:
- VectorTileTagExtractor(const VectorTileLayer &layer);
-
- void setTags(const pbf &pbf);
- mapbox::util::optional<Value> getValue(const std::string &key) const;
- void setType(FeatureType type);
- FeatureType getType() const;
-
-private:
- const VectorTileLayer &layer_;
- pbf tags_;
- FeatureType type_ = FeatureType::Unknown;
-};
-
-/*
- * Allows iterating over the features of a VectorTileLayer using a
- * BucketDescription as filter. Only features matching the descriptions will
- * be returned (as pbf).
- */
-class FilteredVectorTileLayer {
-public:
- class iterator {
- public:
- iterator(const FilteredVectorTileLayer& filter, const pbf& data);
- void operator++();
- bool operator!=(const iterator& other) const;
- const pbf& operator*() const;
-
- private:
- const FilteredVectorTileLayer& parent;
- bool valid = false;
- pbf feature;
- pbf data;
- };
-
-public:
- FilteredVectorTileLayer(const VectorTileLayer& layer, const FilterExpression &filterExpression);
-
- iterator begin() const;
- iterator end() const;
-
-private:
- const VectorTileLayer& layer;
- const FilterExpression& filterExpression;
-};
-
-std::ostream& operator<<(std::ostream&, const PositionedGlyph& placement);
-
-class VectorTileLayer {
-public:
- VectorTileLayer(pbf data);
-
- const pbf data;
- std::string name;
- uint32_t extent = 4096;
- std::vector<std::string> keys;
- std::unordered_map<std::string, uint32_t> key_index;
- std::vector<Value> values;
- std::map<std::string, std::map<Value, Shaping>> shaping;
-};
-
-class VectorTile {
-public:
- VectorTile();
- VectorTile(pbf data);
- VectorTile& operator=(VectorTile&& other);
-
- std::map<std::string, const VectorTileLayer> layers;
-};
-
-
-
-}
-
-#endif
diff --git a/include/mbgl/map/vector_tile_data.hpp b/include/mbgl/map/vector_tile_data.hpp
deleted file mode 100644
index b9bf55a1b3..0000000000
--- a/include/mbgl/map/vector_tile_data.hpp
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef MBGL_MAP_VECTOR_TILE_DATA
-#define MBGL_MAP_VECTOR_TILE_DATA
-
-#include <mbgl/map/tile.hpp>
-#include <mbgl/map/tile_data.hpp>
-#include <mbgl/geometry/elements_buffer.hpp>
-#include <mbgl/geometry/fill_buffer.hpp>
-#include <mbgl/geometry/icon_buffer.hpp>
-#include <mbgl/geometry/line_buffer.hpp>
-#include <mbgl/geometry/text_buffer.hpp>
-
-#include <iosfwd>
-#include <memory>
-#include <unordered_map>
-
-namespace mbgl {
-
-class Bucket;
-class Painter;
-class SourceInfo;
-class StyleLayer;
-class TileParser;
-class GlyphAtlas;
-class GlyphStore;
-class SpriteAtlas;
-class Sprite;
-class TexturePool;
-class Style;
-
-class VectorTileData : public TileData {
- friend class TileParser;
-
-public:
- VectorTileData(Tile::ID const&,
- float mapMaxZoom, util::ptr<Style>,
- GlyphAtlas&, GlyphStore&,
- SpriteAtlas&, util::ptr<Sprite>,
- TexturePool&,
- const SourceInfo&);
- ~VectorTileData();
-
- virtual void parse();
- virtual void render(Painter &painter, util::ptr<StyleLayer> layer_desc, const mat4 &matrix);
- virtual bool hasData(StyleLayer const& layer_desc) const;
-
-protected:
- // Holds the actual geometries in this tile.
- FillVertexBuffer fillVertexBuffer;
- LineVertexBuffer lineVertexBuffer;
- IconVertexBuffer iconVertexBuffer;
- TextVertexBuffer textVertexBuffer;
-
- TriangleElementsBuffer triangleElementsBuffer;
- LineElementsBuffer lineElementsBuffer;
- PointElementsBuffer pointElementsBuffer;
-
- // Holds the buckets of this tile.
- // They contain the location offsets in the buffers stored above
- std::unordered_map<std::string, std::unique_ptr<Bucket>> buckets;
-
- GlyphAtlas& glyphAtlas;
- GlyphStore& glyphStore;
- SpriteAtlas& spriteAtlas;
- util::ptr<Sprite> sprite;
- TexturePool& texturePool;
- util::ptr<Style> style;
-
-public:
- const float depth;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/platform/gl.hpp b/include/mbgl/platform/gl.hpp
index a63dd9b1fb..d16478dab9 100644
--- a/include/mbgl/platform/gl.hpp
+++ b/include/mbgl/platform/gl.hpp
@@ -134,9 +134,9 @@ extern PFNGLISVERTEXARRAYPROC IsVertexArray;
// static int indent = 0;
inline void start_group(const std::string &str) {
if (gl::PushDebugGroup != nullptr) {
- gl::PushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, str.size(), str.c_str());
+ gl::PushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, GLsizei(str.size()), str.c_str());
} else if (gl::PushGroupMarkerEXT != nullptr) {
- gl::PushGroupMarkerEXT(str.size(), str.c_str());
+ gl::PushGroupMarkerEXT(GLsizei(str.size()), str.c_str());
}
// fprintf(stderr, "%s%s\n", std::string(indent * 4, ' ').c_str(), str.c_str());
// indent++;
diff --git a/include/mbgl/renderer/bucket.hpp b/include/mbgl/renderer/bucket.hpp
deleted file mode 100644
index 696bfb1110..0000000000
--- a/include/mbgl/renderer/bucket.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef MBGL_RENDERER_BUCKET
-#define MBGL_RENDERER_BUCKET
-
-#include <mbgl/map/tile.hpp>
-#include <mbgl/util/noncopyable.hpp>
-
-#include <string>
-
-namespace mbgl {
-
-class Painter;
-class StyleLayer;
-
-class Bucket : private util::noncopyable {
-public:
- virtual void render(Painter& painter, util::ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix) = 0;
- virtual bool hasData() const = 0;
- virtual ~Bucket() {}
-
-};
-
-}
-
-#endif
diff --git a/include/mbgl/renderer/debug_bucket.hpp b/include/mbgl/renderer/debug_bucket.hpp
deleted file mode 100644
index fb6cfb4cae..0000000000
--- a/include/mbgl/renderer/debug_bucket.hpp
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef MBGL_RENDERER_DEBUGBUCKET
-#define MBGL_RENDERER_DEBUGBUCKET
-
-#include <mbgl/renderer/bucket.hpp>
-#include <mbgl/geometry/debug_font_buffer.hpp>
-#include <mbgl/geometry/vao.hpp>
-
-#include <vector>
-
-#ifndef BUFFER_OFFSET
-#define BUFFER_OFFSET(i) ((char *)nullptr + (i))
-#endif
-
-namespace mbgl {
-
-class PlainShader;
-
-class DebugBucket : public Bucket {
-public:
- DebugBucket(DebugFontBuffer& fontBuffer);
-
- virtual void render(Painter& painter, util::ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix);
- virtual bool hasData() const;
-
- void drawLines(PlainShader& shader);
- void drawPoints(PlainShader& shader);
-
-private:
- DebugFontBuffer& fontBuffer;
- VertexArrayObject array;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/renderer/fill_bucket.hpp b/include/mbgl/renderer/fill_bucket.hpp
deleted file mode 100644
index ae766ec28d..0000000000
--- a/include/mbgl/renderer/fill_bucket.hpp
+++ /dev/null
@@ -1,88 +0,0 @@
-#ifndef MBGL_RENDERER_FILLBUCKET
-#define MBGL_RENDERER_FILLBUCKET
-
-#include <mbgl/renderer/bucket.hpp>
-#include <mbgl/geometry/elements_buffer.hpp>
-#include <mbgl/geometry/fill_buffer.hpp>
-#include <mbgl/style/style_bucket.hpp>
-
-#include <clipper/clipper.hpp>
-#include <libtess2/tesselator.h>
-
-#include <vector>
-#include <memory>
-
-#ifndef BUFFER_OFFSET
-#define BUFFER_OFFSET(i) ((char *)nullptr + (i))
-#endif
-
-namespace mbgl {
-
-class Style;
-class FillVertexBuffer;
-class TriangleElementsBuffer;
-class LineElementsBuffer;
-class BucketDescription;
-class OutlineShader;
-class PlainShader;
-class PatternShader;
-struct pbf;
-
-class FillBucket : public Bucket {
-
- static void *alloc(void *data, unsigned int size);
- static void *realloc(void *data, void *ptr, unsigned int size);
- static void free(void *userData, void *ptr);
-
- typedef ElementGroup<2> triangle_group_type;
- typedef ElementGroup<1> line_group_type;
-
-public:
- FillBucket(FillVertexBuffer& vertexBuffer,
- TriangleElementsBuffer& triangleElementsBuffer,
- LineElementsBuffer& lineElementsBuffer,
- const StyleBucketFill& properties);
- ~FillBucket();
-
- virtual void render(Painter& painter, util::ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix);
- virtual bool hasData() const;
-
- void addGeometry(pbf& data);
- void tessellate();
-
- void drawElements(PlainShader& shader);
- void drawElements(PatternShader& shader);
- void drawVertices(OutlineShader& shader);
-
-public:
- const StyleBucketFill &properties;
-
-private:
- TESSalloc *allocator;
- TESStesselator *tesselator;
- ClipperLib::Clipper clipper;
-
- FillVertexBuffer& vertexBuffer;
- TriangleElementsBuffer& triangleElementsBuffer;
- LineElementsBuffer& lineElementsBuffer;
-
- // hold information on where the vertices are located in the FillBuffer
- const size_t vertex_start;
- const size_t triangle_elements_start;
- const size_t line_elements_start;
- VertexArrayObject array;
-
- std::vector<triangle_group_type> triangleGroups;
- std::vector<line_group_type> lineGroups;
-
- std::vector<ClipperLib::IntPoint> line;
- bool hasVertices = false;
-
- static const int vertexSize = 2;
- static const int stride = sizeof(TESSreal) * vertexSize;
- static const int vertices_per_group = 3;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/renderer/frame_history.hpp b/include/mbgl/renderer/frame_history.hpp
deleted file mode 100644
index 61bb59da33..0000000000
--- a/include/mbgl/renderer/frame_history.hpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef MBGL_RENDERER_FRAME_HISTORY
-#define MBGL_RENDERER_FRAME_HISTORY
-
-#include <deque>
-#include <cassert>
-#include <cmath>
-
-#include <mbgl/platform/platform.hpp>
-#include <mbgl/util/time.hpp>
-
-namespace mbgl {
-
-struct FrameSnapshot {
- explicit inline FrameSnapshot(timestamp t_, float z_) : t(t_), z(z_) {}
- float t;
- float z;
-};
-
-struct FadeProperties {
- float fadedist;
- float minfadezoom;
- float maxfadezoom;
- float bump;
-};
-
-class FrameHistory {
-public:
- // Record frame history that will be used to calculate fading params
- void record(timestamp now, float zoom);
-
- bool needsAnimation(timestamp duration) const;
- FadeProperties getFadeProperties(timestamp duration);
-
-public:
- std::deque<FrameSnapshot> history;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/renderer/line_bucket.hpp b/include/mbgl/renderer/line_bucket.hpp
deleted file mode 100644
index 7337ca80ad..0000000000
--- a/include/mbgl/renderer/line_bucket.hpp
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef MBGL_RENDERER_LINEBUCKET
-#define MBGL_RENDERER_LINEBUCKET
-
-#include <mbgl/renderer/bucket.hpp>
-#include <mbgl/geometry/vao.hpp>
-#include <mbgl/geometry/elements_buffer.hpp>
-#include <mbgl/geometry/line_buffer.hpp>
-#include <mbgl/style/style_bucket.hpp>
-
-#include <vector>
-
-namespace mbgl {
-
-class Style;
-class LineVertexBuffer;
-class TriangleElementsBuffer;
-class LineShader;
-class LinejoinShader;
-class LinepatternShader;
-struct pbf;
-
-class LineBucket : public Bucket {
- typedef ElementGroup<2> triangle_group_type;
- typedef ElementGroup<1> point_group_type;
-
-public:
- LineBucket(LineVertexBuffer& vertexBuffer,
- TriangleElementsBuffer& triangleElementsBuffer,
- PointElementsBuffer& pointElementsBuffer,
- const StyleBucketLine& properties);
-
- virtual void render(Painter& painter, util::ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix);
- virtual bool hasData() const;
-
- void addGeometry(pbf& data);
- void addGeometry(const std::vector<Coordinate>& line);
-
- bool hasPoints() const;
-
- void drawLines(LineShader& shader);
- void drawLinePatterns(LinepatternShader& shader);
- void drawPoints(LinejoinShader& shader);
-
-public:
- const StyleBucketLine &properties;
-
-private:
- LineVertexBuffer& vertexBuffer;
- TriangleElementsBuffer& triangleElementsBuffer;
- PointElementsBuffer& pointElementsBuffer;
-
- const size_t vertex_start;
- const size_t triangle_elements_start;
- const size_t point_elements_start;
-
- std::vector<triangle_group_type> triangleGroups;
- std::vector<point_group_type> pointGroups;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/renderer/painter.hpp b/include/mbgl/renderer/painter.hpp
deleted file mode 100644
index be4bd12710..0000000000
--- a/include/mbgl/renderer/painter.hpp
+++ /dev/null
@@ -1,259 +0,0 @@
-#ifndef MBGL_RENDERER_PAINTER
-#define MBGL_RENDERER_PAINTER
-
-#include <mbgl/map/tile_data.hpp>
-#include <mbgl/geometry/vao.hpp>
-#include <mbgl/geometry/static_vertex_buffer.hpp>
-#include <mbgl/util/mat4.hpp>
-#include <mbgl/util/noncopyable.hpp>
-#include <mbgl/renderer/frame_history.hpp>
-#include <mbgl/style/types.hpp>
-
-#include <mbgl/shader/plain_shader.hpp>
-#include <mbgl/shader/outline_shader.hpp>
-#include <mbgl/shader/pattern_shader.hpp>
-#include <mbgl/shader/line_shader.hpp>
-#include <mbgl/shader/linejoin_shader.hpp>
-#include <mbgl/shader/linepattern_shader.hpp>
-#include <mbgl/shader/icon_shader.hpp>
-#include <mbgl/shader/raster_shader.hpp>
-#include <mbgl/shader/sdf_shader.hpp>
-#include <mbgl/shader/dot_shader.hpp>
-#include <mbgl/shader/gaussian_shader.hpp>
-
-#include <mbgl/map/transform_state.hpp>
-#include <mbgl/util/ptr.hpp>
-
-#include <map>
-#include <unordered_map>
-#include <set>
-
-namespace mbgl {
-
-enum class RenderPass : bool { Opaque, Translucent };
-
-class Transform;
-class Style;
-class Tile;
-class Sprite;
-class SpriteAtlas;
-class GlyphAtlas;
-class Source;
-class StyleSource;
-class StyleLayerGroup;
-
-class FillBucket;
-class LineBucket;
-class SymbolBucket;
-class RasterBucket;
-class PrerenderedTexture;
-
-struct FillProperties;
-struct RasterProperties;
-
-class LayerDescription;
-class RasterTileData;
-
-class Painter : private util::noncopyable {
-public:
- Painter(SpriteAtlas&, GlyphAtlas&);
- ~Painter();
-
- void setup();
-
- // Perform cleanup tasks that prepare shutting down the app. This doesn't mean that the
- // app will be shut down. That means all operations must be automatically be reversed (e.g. through
- // lazy initialization) in case rendering continues.
- void cleanup();
-
- void terminate();
-
- // Renders the backdrop of the OpenGL view. This also paints in areas where we don't have any
- // tiles whatsoever.
- void clear();
-
- // Updates the default matrices to the current viewport dimensions.
- void changeMatrix();
-
- void render(const Style& style,
- const std::set<util::ptr<StyleSource>>& sources,
- TransformState state,
- timestamp time);
-
- void renderLayers(util::ptr<StyleLayerGroup> group);
- void renderLayer(util::ptr<StyleLayer> layer_desc, const Tile::ID* id = nullptr, const mat4* matrix = nullptr);
-
- // Renders a particular layer from a tile.
- void renderTileLayer(const Tile& tile, util::ptr<StyleLayer> layer_desc, const mat4 &matrix);
-
- // Renders debug information for a tile.
- void renderTileDebug(const Tile& tile);
-
- // Renders the red debug frame around a tile, visualizing its perimeter.
- void renderDebugFrame(const mat4 &matrix);
-
- void renderDebugText(DebugBucket& bucket, const mat4 &matrix);
- void renderDebugText(const std::vector<std::string> &strings);
- void renderFill(FillBucket& bucket, util::ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix);
- void renderLine(LineBucket& bucket, util::ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix);
- void renderSymbol(SymbolBucket& bucket, util::ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix);
- void renderRaster(RasterBucket& bucket, util::ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix);
- void renderBackground(util::ptr<StyleLayer> layer_desc);
-
- float saturationFactor(float saturation);
- float contrastFactor(float contrast);
- std::array<float, 3> spinWeights(float spin_value);
-
- void preparePrerender(RasterBucket &bucket);
-
- void renderPrerenderedTexture(RasterBucket &bucket, const mat4 &matrix, const RasterProperties& properties);
-
- void createPrerendered(RasterBucket& bucket, util::ptr<StyleLayer> layer_desc, const Tile::ID& id);
-
- void resize();
-
- // Changes whether debug information is drawn onto the map
- void setDebug(bool enabled);
-
- // Opaque/Translucent pass setting
- void setOpaque();
- void setTranslucent();
-
- // Configures the painter strata that is used for early z-culling of fragments.
- void setStrata(float strata);
-
- void drawClippingMasks(const std::set<util::ptr<StyleSource>> &sources);
- void drawClippingMask(const mat4& matrix, const ClipID& clip);
-
- void resetFramebuffer();
- void bindFramebuffer();
- void pushFramebuffer();
- GLuint popFramebuffer();
- void discardFramebuffers();
-
- bool needsAnimation() const;
-
-private:
- void setupShaders();
- void deleteShaders();
- mat4 translatedMatrix(const mat4& matrix, const std::array<float, 2> &translation, const Tile::ID &id, TranslateAnchorType anchor);
-
- void prepareTile(const Tile& tile);
-
- template <typename BucketProperties, typename StyleProperties>
- void renderSDF(SymbolBucket &bucket,
- const Tile::ID &id,
- const mat4 &matrixSymbol,
- const BucketProperties& bucketProperties,
- const StyleProperties& styleProperties,
- float scaleDivisor,
- std::array<float, 2> texsize,
- SDFShader& sdfShader,
- void (SymbolBucket::*drawSDF)(SDFShader&));
-
-public:
- void useProgram(uint32_t program);
- void lineWidth(float lineWidth);
- void depthMask(bool value);
- void depthRange(float near, float far);
-
-public:
- mat4 projMatrix;
- mat4 nativeMatrix;
- mat4 extrudeMatrix;
-
- // used to composite images and flips the geometry upside down
- const mat4 flipMatrix = []{
- mat4 flip;
- matrix::ortho(flip, 0, 4096, -4096, 0, 0, 1);
- matrix::translate(flip, flip, 0, -4096, 0);
- return flip;
- }();
-
- const mat4 identityMatrix = []{
- mat4 identity;
- matrix::identity(identity);
- return identity;
- }();
-
-private:
- TransformState state;
-
- bool debug = false;
- int indent = 0;
-
- uint32_t gl_program = 0;
- float gl_lineWidth = 0;
- bool gl_depthMask = true;
- std::array<uint16_t, 2> gl_viewport = {{ 0, 0 }};
- std::array<float, 2> gl_depthRange = {{ 0, 1 }};
- float strata = 0;
- RenderPass pass = RenderPass::Opaque;
- const float strata_epsilon = 1.0f / (1 << 16);
-
-public:
- FrameHistory frameHistory;
-
- SpriteAtlas& spriteAtlas;
- GlyphAtlas& glyphAtlas;
-
- std::unique_ptr<PlainShader> plainShader;
- std::unique_ptr<OutlineShader> outlineShader;
- std::unique_ptr<LineShader> lineShader;
- std::unique_ptr<LinejoinShader> linejoinShader;
- std::unique_ptr<LinepatternShader> linepatternShader;
- std::unique_ptr<PatternShader> patternShader;
- std::unique_ptr<IconShader> iconShader;
- std::unique_ptr<RasterShader> rasterShader;
- std::unique_ptr<SDFGlyphShader> sdfGlyphShader;
- std::unique_ptr<SDFIconShader> sdfIconShader;
- std::unique_ptr<DotShader> dotShader;
- std::unique_ptr<GaussianShader> gaussianShader;
-
- StaticVertexBuffer backgroundBuffer = {
- { -1, -1 }, { 1, -1 },
- { -1, 1 }, { 1, 1 }
- };
-
- VertexArrayObject backgroundArray;
-
- // Set up the stencil quad we're using to generate the stencil mask.
- StaticVertexBuffer tileStencilBuffer = {
- // top left triangle
- { 0, 0 },
- { 4096, 0 },
- { 0, 4096 },
-
- // bottom right triangle
- { 4096, 0 },
- { 0, 4096 },
- { 4096, 4096 },
- };
-
- VertexArrayObject coveringPlainArray;
- VertexArrayObject coveringRasterArray;
- VertexArrayObject coveringGaussianArray;
-
- // Set up the tile boundary lines we're using to draw the tile outlines.
- StaticVertexBuffer tileBorderBuffer = {
- { 0, 0 },
- { 4096, 0 },
- { 4096, 4096 },
- { 0, 4096 },
- { 0, 0 },
- };
-
- VertexArrayObject tileBorderArray;
-
- // Framebuffer management
- std::vector<GLuint> fbos;
- std::vector<GLuint> fbos_color;
- GLuint fbo_depth_stencil;
- int fbo_level = -1;
- bool fbo_depth_stencil_valid = false;
-
-};
-
-}
-
-#endif
diff --git a/include/mbgl/renderer/prerendered_texture.hpp b/include/mbgl/renderer/prerendered_texture.hpp
deleted file mode 100644
index e4dc610418..0000000000
--- a/include/mbgl/renderer/prerendered_texture.hpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef MBGL_RENDERER_PRERENDERED_TEXTURE
-#define MBGL_RENDERER_PRERENDERED_TEXTURE
-
-#include <mbgl/util/noncopyable.hpp>
-#include <mbgl/platform/gl.hpp>
-
-namespace mbgl {
-
-class StyleBucketRaster;
-class Painter;
-
-class PrerenderedTexture : private util::noncopyable {
-public:
- PrerenderedTexture(const StyleBucketRaster &properties);
- ~PrerenderedTexture();
-
- void bindTexture();
- void bindFramebuffer();
- void unbindFramebuffer();
-
- inline GLuint getTexture() const { return texture; }
-
- void blur(Painter& painter, uint16_t passes);
-
-public:
- const StyleBucketRaster &properties;
-
-private:
- GLint previous_fbo = 0;
- GLuint fbo = 0;
- GLuint texture = 0;
- GLuint fbo_depth_stencil = 0;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/renderer/raster_bucket.hpp b/include/mbgl/renderer/raster_bucket.hpp
deleted file mode 100644
index 0a7651d7cc..0000000000
--- a/include/mbgl/renderer/raster_bucket.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef MBGL_RENDERER_RASTERBUCKET
-#define MBGL_RENDERER_RASTERBUCKET
-
-#include <mbgl/renderer/bucket.hpp>
-#include <mbgl/util/raster.hpp>
-#include <mbgl/renderer/prerendered_texture.hpp>
-#include <mbgl/style/style_bucket.hpp>
-
-
-
-namespace mbgl {
-
-class RasterShader;
-class StaticVertexBuffer;
-class VertexArrayObject;
-
-class RasterBucket : public Bucket {
-public:
- RasterBucket(TexturePool&, const StyleBucketRaster&);
-
- virtual void render(Painter& painter, util::ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix);
- virtual bool hasData() const;
-
- bool setImage(const std::string &data);
-
- const StyleBucketRaster &properties;
- PrerenderedTexture texture;
-
- void drawRaster(RasterShader& shader, StaticVertexBuffer &vertices, VertexArrayObject &array);
-
- void drawRaster(RasterShader& shader, StaticVertexBuffer &vertices, VertexArrayObject &array, GLuint texture);
-
- Raster raster;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/renderer/symbol_bucket.hpp b/include/mbgl/renderer/symbol_bucket.hpp
deleted file mode 100644
index 9a5da1d012..0000000000
--- a/include/mbgl/renderer/symbol_bucket.hpp
+++ /dev/null
@@ -1,114 +0,0 @@
-#ifndef MBGL_RENDERER_SYMBOLBUCKET
-#define MBGL_RENDERER_SYMBOLBUCKET
-
-#include "bucket.hpp"
-#include <mbgl/geometry/vao.hpp>
-#include <mbgl/geometry/elements_buffer.hpp>
-#include <mbgl/geometry/text_buffer.hpp>
-#include <mbgl/geometry/icon_buffer.hpp>
-#include <mbgl/map/vector_tile.hpp>
-#include <mbgl/text/types.hpp>
-#include <mbgl/text/glyph.hpp>
-#include <mbgl/style/style_bucket.hpp>
-
-#include <memory>
-#include <map>
-#include <vector>
-
-namespace mbgl {
-
-class Style;
-class SDFShader;
-class IconShader;
-class DotShader;
-class Collision;
-class SpriteAtlas;
-class Sprite;
-class GlyphAtlas;
-class GlyphStore;
-class FontStack;
-
-class SymbolFeature {
-public:
- pbf geometry;
- std::u32string label;
- std::string sprite;
-};
-
-
-class Symbol {
-public:
- vec2<float> tl, tr, bl, br;
- Rect<uint16_t> tex;
- float angle;
- float minScale = 0.0f;
- float maxScale = std::numeric_limits<float>::infinity();
- CollisionAnchor anchor;
-};
-
-typedef std::vector<Symbol> Symbols;
-
-
-class SymbolBucket : public Bucket {
- typedef ElementGroup<1> TextElementGroup;
- typedef ElementGroup<2> IconElementGroup;
-
-public:
- SymbolBucket(const StyleBucketSymbol &properties, Collision &collision);
-
- virtual void render(Painter &painter, util::ptr<StyleLayer> layer_desc, const Tile::ID &id, const mat4 &matrix);
- virtual bool hasData() const;
- virtual bool hasTextData() const;
- virtual bool hasIconData() const;
-
- void addFeatures(const VectorTileLayer &layer, const FilterExpression &filter,
- const Tile::ID &id, SpriteAtlas &spriteAtlas, Sprite &sprite,
- GlyphAtlas &glyphAtlas, GlyphStore &glyphStore);
-
- void addGlyphs(const PlacedGlyphs &glyphs, float placementZoom, PlacementRange placementRange,
- float zoom);
-
- void drawGlyphs(SDFShader& shader);
- void drawIcons(SDFShader& shader);
- void drawIcons(IconShader& shader);
-
-private:
-
- std::vector<SymbolFeature> processFeatures(const VectorTileLayer &layer, const FilterExpression &filter, GlyphStore &glyphStore, const Sprite &sprite);
-
-
- void addFeature(const pbf &geom_pbf, const Shaping &shaping, const GlyphPositions &face, const Rect<uint16_t> &image);
- void addFeature(const std::vector<Coordinate> &line, const Shaping &shaping, const GlyphPositions &face, const Rect<uint16_t> &image);
-
-
- // Adds placed items to the buffer.
- template <typename Buffer>
- void addSymbols(Buffer &buffer, const PlacedGlyphs &symbols, float scale, PlacementRange placementRange);
-
- // Adds glyphs to the glyph atlas so that they have a left/top/width/height coordinates associated to them that we can use for writing to a buffer.
- static void addGlyphsToAtlas(uint64_t tileid, const std::string stackname, const std::u32string &string,
- const FontStack &fontStack, GlyphAtlas &glyphAtlas, GlyphPositions &face);
-
-public:
- const StyleBucketSymbol &properties;
- bool sdfIcons = false;
-
-private:
- Collision &collision;
-
- struct {
- TextVertexBuffer vertices;
- TriangleElementsBuffer triangles;
- std::vector<TextElementGroup> groups;
- } text;
-
- struct {
- IconVertexBuffer vertices;
- TriangleElementsBuffer triangles;
- std::vector<IconElementGroup> groups;
- } icon;
-
-};
-}
-
-#endif
diff --git a/include/mbgl/shader/dot_shader.hpp b/include/mbgl/shader/dot_shader.hpp
deleted file mode 100644
index 2c4176f364..0000000000
--- a/include/mbgl/shader/dot_shader.hpp
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef MBGL_SHADER_SHADER_DOT
-#define MBGL_SHADER_SHADER_DOT
-
-#include <mbgl/shader/shader.hpp>
-#include <mbgl/shader/uniform.hpp>
-
-namespace mbgl {
-
-class DotShader : public Shader {
-public:
- DotShader();
-
- void bind(char *offset);
-
- UniformMatrix<4> u_matrix = {"u_matrix", *this};
- Uniform<std::array<float, 4>> u_color = {"u_color", *this};
- Uniform<float> u_size = {"u_size", *this};
- Uniform<float> u_blur = {"u_blur", *this};
-
-private:
- int32_t a_pos = -1;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/shader/gaussian_shader.hpp b/include/mbgl/shader/gaussian_shader.hpp
deleted file mode 100644
index 0f494f5c7e..0000000000
--- a/include/mbgl/shader/gaussian_shader.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef MBGL_RENDERER_SHADER_GAUSSIAN
-#define MBGL_RENDERER_SHADER_GAUSSIAN
-
-#include <mbgl/shader/shader.hpp>
-#include <mbgl/shader/uniform.hpp>
-
-namespace mbgl {
-
-class GaussianShader : public Shader {
-public:
- GaussianShader();
-
- void bind(char *offset);
-
- UniformMatrix<4> u_matrix = {"u_matrix", *this};
- Uniform<std::array<float, 2>> u_offset = {"u_offset", *this};
- Uniform<int32_t> u_image = {"u_image", *this};
-
-private:
- int32_t a_pos = -1;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/shader/icon_shader.hpp b/include/mbgl/shader/icon_shader.hpp
deleted file mode 100644
index 645d7e21b6..0000000000
--- a/include/mbgl/shader/icon_shader.hpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef MBGL_SHADER_SHADER_ICON
-#define MBGL_SHADER_SHADER_ICON
-
-#include <mbgl/shader/shader.hpp>
-#include <mbgl/shader/uniform.hpp>
-
-namespace mbgl {
-
-class IconShader : public Shader {
-public:
- IconShader();
-
- void bind(char *offset);
-
- UniformMatrix<4> u_matrix = {"u_matrix", *this};
- UniformMatrix<4> u_exmatrix = {"u_exmatrix", *this};
- Uniform<float> u_angle = {"u_angle", *this};
- Uniform<float> u_zoom = {"u_zoom", *this};
- Uniform<float> u_flip = {"u_flip", *this};
- Uniform<float> u_fadedist = {"u_fadedist", *this};
- Uniform<float> u_minfadezoom = {"u_minfadezoom", *this};
- Uniform<float> u_maxfadezoom = {"u_maxfadezoom", *this};
- Uniform<float> u_fadezoom = {"u_fadezoom", *this};
- Uniform<float> u_opacity = {"u_opacity", *this};
- Uniform<std::array<float, 2>> u_texsize = {"u_texsize", *this};
-
-private:
- int32_t a_pos = -1;
- int32_t a_offset = -1;
- int32_t a_tex = -1;
- int32_t a_angle = -1;
- int32_t a_minzoom = -1;
- int32_t a_maxzoom = -1;
- int32_t a_rangeend = -1;
- int32_t a_rangestart = -1;
- int32_t a_labelminzoom = -1;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/shader/line_shader.hpp b/include/mbgl/shader/line_shader.hpp
deleted file mode 100644
index b789330882..0000000000
--- a/include/mbgl/shader/line_shader.hpp
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef MBGL_SHADER_SHADER_LINE
-#define MBGL_SHADER_SHADER_LINE
-
-#include <mbgl/shader/shader.hpp>
-#include <mbgl/shader/uniform.hpp>
-
-namespace mbgl {
-
-class LineShader : public Shader {
-public:
- LineShader();
-
- void bind(char *offset);
-
- UniformMatrix<4> u_matrix = {"u_matrix", *this};
- UniformMatrix<4> u_exmatrix = {"u_exmatrix", *this};
- Uniform<std::array<float, 4>> u_color = {"u_color", *this};
- Uniform<std::array<float, 2>> u_linewidth = {"u_linewidth", *this};
- Uniform<std::array<float, 2>> u_dasharray = {"u_dasharray", *this};
- Uniform<float> u_ratio = {"u_ratio", *this};
- Uniform<float> u_blur = {"u_blur", *this};
-
-private:
- int32_t a_pos = -1;
- int32_t a_extrude = -1;
- int32_t a_linesofar = -1;
-};
-
-
-}
-
-#endif
diff --git a/include/mbgl/shader/linejoin_shader.hpp b/include/mbgl/shader/linejoin_shader.hpp
deleted file mode 100644
index 61406fd45c..0000000000
--- a/include/mbgl/shader/linejoin_shader.hpp
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef MBGL_SHADER_SHADER_LINEJOIN
-#define MBGL_SHADER_SHADER_LINEJOIN
-
-#include <mbgl/shader/shader.hpp>
-#include <mbgl/shader/uniform.hpp>
-
-namespace mbgl {
-
-class LinejoinShader : public Shader {
-public:
- LinejoinShader();
-
- void bind(char *offset);
-
- UniformMatrix<4> u_matrix = {"u_matrix", *this};
- Uniform<std::array<float, 4>> u_color = {"u_color", *this};
- Uniform<std::array<float, 2>> u_world = {"u_world", *this};
- Uniform<std::array<float, 2>> u_linewidth = {"u_linewidth", *this};
- Uniform<float> u_size = {"u_size", *this};
-
-private:
- int32_t a_pos = -1;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/shader/linepattern_shader.hpp b/include/mbgl/shader/linepattern_shader.hpp
deleted file mode 100644
index bf85940b8a..0000000000
--- a/include/mbgl/shader/linepattern_shader.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef MBGL_SHADER_SHADER_LINEPATTERN
-#define MBGL_SHADER_SHADER_LINEPATTERN
-
-#include <mbgl/shader/shader.hpp>
-#include <mbgl/shader/uniform.hpp>
-
-namespace mbgl {
-
-class LinepatternShader : public Shader {
-public:
- LinepatternShader();
-
- void bind(char *offset);
-
- UniformMatrix<4> u_matrix = {"u_matrix", *this};
- UniformMatrix<4> u_exmatrix = {"u_exmatrix", *this};
- Uniform<std::array<float, 2>> u_linewidth = {"u_linewidth", *this};
- Uniform<std::array<float, 2>> u_pattern_size = {"u_pattern_size", *this};
- Uniform<std::array<float, 2>> u_pattern_tl = {"u_pattern_tl", *this};
- Uniform<std::array<float, 2>> u_pattern_br = {"u_pattern_br", *this};
- Uniform<float> u_ratio = {"u_ratio", *this};
- Uniform<float> u_point = {"u_point", *this};
- Uniform<float> u_blur = {"u_blur", *this};
- Uniform<float> u_fade = {"u_fade", *this};
-
-private:
- int32_t a_pos = -1;
- int32_t a_extrude = -1;
- int32_t a_linesofar = -1;
-};
-}
-
-#endif
diff --git a/include/mbgl/shader/outline_shader.hpp b/include/mbgl/shader/outline_shader.hpp
deleted file mode 100644
index f3e8175fd7..0000000000
--- a/include/mbgl/shader/outline_shader.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef MBGL_SHADER_SHADER_OUTLINE
-#define MBGL_SHADER_SHADER_OUTLINE
-
-#include <mbgl/shader/shader.hpp>
-#include <mbgl/shader/uniform.hpp>
-
-namespace mbgl {
-
-class OutlineShader : public Shader {
-public:
- OutlineShader();
-
- void bind(char *offset);
-
- UniformMatrix<4> u_matrix = {"u_matrix", *this};
- Uniform<std::array<float, 4>> u_color = {"u_color", *this};
- Uniform<std::array<float, 2>> u_world = {"u_world", *this};
-
-private:
- int32_t a_pos = -1;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/shader/pattern_shader.hpp b/include/mbgl/shader/pattern_shader.hpp
deleted file mode 100644
index 9fabd8e18a..0000000000
--- a/include/mbgl/shader/pattern_shader.hpp
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef MBGL_SHADER_SHADER_PATTERN
-#define MBGL_SHADER_SHADER_PATTERN
-
-#include <mbgl/shader/shader.hpp>
-#include <mbgl/shader/uniform.hpp>
-
-namespace mbgl {
-
-class PatternShader : public Shader {
-public:
- PatternShader();
-
- void bind(char *offset);
-
- UniformMatrix<4> u_matrix = {"u_matrix", *this};
- Uniform<std::array<float, 2>> u_pattern_tl = {"u_pattern_tl", *this};
- Uniform<std::array<float, 2>> u_pattern_br = {"u_pattern_br", *this};
- Uniform<float> u_opacity = {"u_opacity", *this};
- Uniform<float> u_mix = {"u_mix", *this};
- Uniform<int32_t> u_image = {"u_image", *this};
- UniformMatrix<3> u_patternmatrix = {"u_patternmatrix", *this};
-
-private:
- int32_t a_pos = -1;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/shader/plain_shader.hpp b/include/mbgl/shader/plain_shader.hpp
deleted file mode 100644
index 051501c3c9..0000000000
--- a/include/mbgl/shader/plain_shader.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef MBGL_SHADER_SHADER_PLAIN
-#define MBGL_SHADER_SHADER_PLAIN
-
-#include <mbgl/shader/shader.hpp>
-#include <mbgl/shader/uniform.hpp>
-
-namespace mbgl {
-
-class PlainShader : public Shader {
-public:
- PlainShader();
-
- void bind(char *offset);
-
- UniformMatrix<4> u_matrix = {"u_matrix", *this};
- Uniform<std::array<float, 4>> u_color = {"u_color", *this};
-
-private:
- int32_t a_pos = -1;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/shader/raster_shader.hpp b/include/mbgl/shader/raster_shader.hpp
deleted file mode 100644
index 8cf97055a2..0000000000
--- a/include/mbgl/shader/raster_shader.hpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef MBGL_RENDERER_SHADER_RASTER
-#define MBGL_RENDERER_SHADER_RASTER
-
-#include <mbgl/shader/shader.hpp>
-#include <mbgl/shader/uniform.hpp>
-
-namespace mbgl {
-
-class RasterShader : public Shader {
-public:
- RasterShader();
-
- void bind(char *offset);
-
- UniformMatrix<4> u_matrix = {"u_matrix", *this};
- Uniform<int32_t> u_image = {"u_image", *this};
- Uniform<float> u_opacity = {"u_opacity", *this};
- Uniform<float> u_buffer = {"u_buffer", *this};
- Uniform<float> u_brightness_low = {"u_brightness_low", *this};
- Uniform<float> u_brightness_high = {"u_brightness_high", *this};
- Uniform<float> u_saturation_factor = {"u_saturation_factor", *this};
- Uniform<float> u_contrast_factor = {"u_contrast_factor", *this};
- Uniform<std::array<float, 3>> u_spin_weights = {"u_spin_weights", *this};
-
-private:
- int32_t a_pos = -1;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/shader/sdf_shader.hpp b/include/mbgl/shader/sdf_shader.hpp
deleted file mode 100644
index 0737c25ee1..0000000000
--- a/include/mbgl/shader/sdf_shader.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef MBGL_SHADER_SDF_SHADER
-#define MBGL_SHADER_SDF_SHADER
-
-#include <mbgl/shader/shader.hpp>
-#include <mbgl/shader/uniform.hpp>
-
-namespace mbgl {
-
-class SDFShader : public Shader {
-public:
- SDFShader();
-
- virtual void bind(char *offset) = 0;
-
- UniformMatrix<4> u_matrix = {"u_matrix", *this};
- UniformMatrix<4> u_exmatrix = {"u_exmatrix", *this};
- Uniform<std::array<float, 4>> u_color = {"u_color", *this};
- Uniform<std::array<float, 2>> u_texsize = {"u_texsize", *this};
- Uniform<float> u_buffer = {"u_buffer", *this};
- Uniform<float> u_gamma = {"u_gamma", *this};
- Uniform<float> u_angle = {"u_angle", *this};
- Uniform<float> u_zoom = {"u_zoom", *this};
- Uniform<float> u_flip = {"u_flip", *this};
- Uniform<float> u_fadedist = {"u_fadedist", *this};
- Uniform<float> u_minfadezoom = {"u_minfadezoom", *this};
- Uniform<float> u_maxfadezoom = {"u_maxfadezoom", *this};
- Uniform<float> u_fadezoom = {"u_fadezoom", *this};
-
-protected:
- int32_t a_pos = -1;
- int32_t a_offset = -1;
- int32_t a_tex = -1;
- int32_t a_angle = -1;
- int32_t a_minzoom = -1;
- int32_t a_maxzoom = -1;
- int32_t a_rangeend = -1;
- int32_t a_rangestart = -1;
- int32_t a_labelminzoom = -1;
-};
-
-class SDFGlyphShader : public SDFShader {
-public:
- void bind(char *offset);
-};
-
-class SDFIconShader : public SDFShader {
-public:
- void bind(char *offset);
-};
-
-}
-
-#endif
diff --git a/include/mbgl/shader/shader.hpp b/include/mbgl/shader/shader.hpp
deleted file mode 100644
index 27e831a510..0000000000
--- a/include/mbgl/shader/shader.hpp
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef MBGL_RENDERER_SHADER
-#define MBGL_RENDERER_SHADER
-
-#include <cstdint>
-#include <array>
-#include <mbgl/util/noncopyable.hpp>
-
-namespace mbgl {
-
-class Shader : private util::noncopyable {
-public:
- Shader(const char *name, const char *vertex, const char *fragment);
- ~Shader();
- const char *name;
- bool valid;
- uint32_t program;
-
- inline uint32_t getID() const {
- return program;
- }
-
-private:
- bool compileShader(uint32_t *shader, uint32_t type, const char *source);
-};
-
-}
-
-#endif
diff --git a/include/mbgl/shader/uniform.hpp b/include/mbgl/shader/uniform.hpp
deleted file mode 100644
index a87bbd7aa3..0000000000
--- a/include/mbgl/shader/uniform.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef MBGL_SHADER_UNIFORM
-#define MBGL_SHADER_UNIFORM
-
-#include <mbgl/shader/shader.hpp>
-#include <mbgl/platform/gl.hpp>
-
-namespace mbgl {
-
-template <typename T>
-class Uniform {
-public:
- Uniform(const GLchar* name, const Shader& shader)
- : location(glGetUniformLocation(shader.program, name)) {}
-
- void operator=(const T& t) {
- if (current != t) {
- current = t;
- bind(t);
- }
- }
-
-private:
- void bind(const T&);
-
- T current;
- GLint location;
-};
-
-template <size_t C, size_t R = C>
-class UniformMatrix {
-public:
- typedef std::array<float, C*R> T;
-
- UniformMatrix(const GLchar* name, const Shader& shader)
- : location(glGetUniformLocation(shader.program, name)) {}
-
- void operator=(const T& t) {
- if (current != t) {
- current = t;
- bind(t);
- }
- }
-
-private:
- void bind(const T&);
-
- T current;
- GLint location;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/storage/base_request.hpp b/include/mbgl/storage/base_request.hpp
deleted file mode 100644
index 2913c5eae5..0000000000
--- a/include/mbgl/storage/base_request.hpp
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef MBGL_STORAGE_BASE_REQUEST
-#define MBGL_STORAGE_BASE_REQUEST
-
-#include <mbgl/storage/request_callback.hpp>
-#include <mbgl/util/ptr.hpp>
-
-#include <string>
-#include <forward_list>
-#include <functional>
-#include <thread>
-
-typedef struct uv_loop_s uv_loop_t;
-typedef struct uv_async_s uv_async_t;
-
-namespace mbgl {
-
-class Response;
-class Request;
-
-class BaseRequest {
-private:
- // Make noncopyable and immovable
- BaseRequest(const BaseRequest &) = delete;
- BaseRequest(BaseRequest &&) = delete;
- BaseRequest& operator=(const BaseRequest &) = delete;
- BaseRequest& operator=(BaseRequest &&) = delete;
-
-public:
- BaseRequest(const std::string &path);
- virtual ~BaseRequest();
-
- Callback *add(Callback &&callback, const util::ptr<BaseRequest> &request);
- void remove(Callback *callback);
-
- // Must be called by subclasses when a valid Response object is available. It will notify
- // all listeners.
- void notify();
-
- // This function is called when the request ought to be stopped. Any subclass must make sure this
- // is also called in its destructor. Calling this function repeatedly must be safe.
- // This function must call notify().
- virtual void cancel() = 0;
-
- // This function is called when the request should be reattempted immediately. This is typically
- // reaction to a network status change.
- virtual void retryImmediately();
-
-public:
- const std::thread::id thread_id;
- const std::string path;
- std::unique_ptr<Response> response;
-
-protected:
- // This object may hold a shared_ptr to itself. It does this to prevent destruction of this object
- // while a request is in progress.
- util::ptr<BaseRequest> self;
- std::forward_list<std::unique_ptr<Callback>> callbacks;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/platform/default/caching_http_file_source.hpp b/include/mbgl/storage/caching_http_file_source.hpp
index c394474881..a093ef2441 100644
--- a/include/mbgl/platform/default/caching_http_file_source.hpp
+++ b/include/mbgl/storage/caching_http_file_source.hpp
@@ -1,7 +1,7 @@
#ifndef MBGL_STORAGE_CACHING_HTTP_FILE_SOURCE
#define MBGL_STORAGE_CACHING_HTTP_FILE_SOURCE
-#include <mbgl/storage/file_source.hpp>
+#include "file_source.hpp"
#include <thread>
#include <unordered_map>
@@ -16,7 +16,7 @@ class SQLiteStore;
class CachingHTTPFileSource : public FileSource {
public:
CachingHTTPFileSource(const std::string &path_);
- ~CachingHTTPFileSource();
+ virtual ~CachingHTTPFileSource();
// Stores and checks the libuv loop for requests
void setLoop(uv_loop_t*);
diff --git a/include/mbgl/storage/file_request.hpp b/include/mbgl/storage/file_request.hpp
deleted file mode 100644
index 2f883728ff..0000000000
--- a/include/mbgl/storage/file_request.hpp
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef MBGL_STORAGE_FILE_REQUEST
-#define MBGL_STORAGE_FILE_REQUEST
-
-#include <mbgl/storage/base_request.hpp>
-
-namespace mbgl {
-
-typedef struct uv_loop_s uv_loop_t;
-
-struct FileRequestBaton;
-
-class FileRequest : public BaseRequest {
-public:
- FileRequest(const std::string &path, uv_loop_t *loop);
- ~FileRequest();
-
- void cancel();
-
-private:
- FileRequestBaton *ptr = nullptr;
-
- friend struct FileRequestBaton;
-};
-
-}
-
-#endif \ No newline at end of file
diff --git a/include/mbgl/storage/file_request_baton.hpp b/include/mbgl/storage/file_request_baton.hpp
deleted file mode 100644
index 897c88061d..0000000000
--- a/include/mbgl/storage/file_request_baton.hpp
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef MBGL_STORAGE_FILE_REQUEST_BATON
-#define MBGL_STORAGE_FILE_REQUEST_BATON
-
-#include <mbgl/storage/file_request.hpp>
-#include <thread>
-
-#include <uv.h>
-
-namespace mbgl {
-
-struct FileRequestBaton {
- FileRequestBaton(FileRequest *request_, const std::string &path, uv_loop_t *loop);
- ~FileRequestBaton();
-
- void cancel();
- static void file_opened(uv_fs_t *req);
- static void file_stated(uv_fs_t *req);
- static void file_read(uv_fs_t *req);
- static void file_closed(uv_fs_t *req);
- static void notify_error(uv_fs_t *req);
- static void cleanup(uv_fs_t *req);
-
- const std::thread::id thread_id;
- FileRequest *request = nullptr;
- uv_fs_t req;
- uv_file fd = -1;
- bool canceled = false;
- std::string body;
- uv_buf_t buffer;
-};
-
-
-}
-
-
-#endif
diff --git a/include/mbgl/storage/file_source.hpp b/include/mbgl/storage/file_source.hpp
index e825a9d61c..eeda529bf1 100644
--- a/include/mbgl/storage/file_source.hpp
+++ b/include/mbgl/storage/file_source.hpp
@@ -2,14 +2,15 @@
#define MBGL_STORAGE_FILE_SOURCE
#include <mbgl/util/noncopyable.hpp>
-#include <mbgl/storage/resource_type.hpp>
-#include <mbgl/storage/request.hpp>
+#include "resource_type.hpp"
+#include "request.hpp"
#include <string>
#include <functional>
typedef struct uv_loop_s uv_loop_t;
+
namespace mbgl {
class FileSource : public util::noncopyable {
diff --git a/include/mbgl/storage/http_request.hpp b/include/mbgl/storage/http_request.hpp
deleted file mode 100644
index 71d6e8814c..0000000000
--- a/include/mbgl/storage/http_request.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef MBGL_STORAGE_HTTP_REQUEST
-#define MBGL_STORAGE_HTTP_REQUEST
-
-#include <mbgl/storage/resource_type.hpp>
-#include <mbgl/storage/base_request.hpp>
-#include <mbgl/storage/http_request_baton.hpp>
-
-#include <string>
-#include <memory>
-#include <cassert>
-#include <thread>
-
-typedef struct uv_loop_s uv_loop_t;
-typedef struct uv_timer_s uv_timer_t;
-
-namespace mbgl {
-
-struct CacheRequestBaton;
-struct HTTPRequestBaton;
-struct CacheEntry;
-class SQLiteStore;
-
-class HTTPRequest : public BaseRequest {
-public:
- HTTPRequest(ResourceType type, const std::string &path, uv_loop_t *loop, util::ptr<SQLiteStore> store);
- ~HTTPRequest();
-
- void cancel();
- void retryImmediately();
-
-private:
- void startCacheRequest();
- void handleCacheResponse(std::unique_ptr<Response> &&response);
- void startHTTPRequest(std::unique_ptr<Response> &&res);
- void handleHTTPResponse(HTTPResponseType responseType, std::unique_ptr<Response> &&response);
-
- void retryHTTPRequest(std::unique_ptr<Response> &&res, uint64_t timeout);
-
- void removeCacheBaton();
- void removeHTTPBaton();
- void removeBackoffTimer();
-
-private:
- const std::thread::id thread_id;
- uv_loop_t *const loop;
- CacheRequestBaton *cache_baton = nullptr;
- util::ptr<HTTPRequestBaton> http_baton;
- uv_timer_t *backoff_timer = nullptr;
- util::ptr<SQLiteStore> store;
- const ResourceType type;
- uint8_t attempts = 0;
-
- friend struct HTTPRequestBaton;
-};
-
-}
-
-#endif \ No newline at end of file
diff --git a/include/mbgl/storage/http_request_baton.hpp b/include/mbgl/storage/http_request_baton.hpp
index 545f9e236c..74c0ff498e 100644
--- a/include/mbgl/storage/http_request_baton.hpp
+++ b/include/mbgl/storage/http_request_baton.hpp
@@ -1,7 +1,7 @@
#ifndef MBGL_STORAGE_HTTP_REQUEST_BATON
#define MBGL_STORAGE_HTTP_REQUEST_BATON
-#include <mbgl/storage/response.hpp>
+#include "response.hpp"
#include <mbgl/util/ptr.hpp>
#include <string>
diff --git a/include/mbgl/storage/request.hpp b/include/mbgl/storage/request.hpp
index 11b5541d18..f63283aa2f 100644
--- a/include/mbgl/storage/request.hpp
+++ b/include/mbgl/storage/request.hpp
@@ -1,8 +1,9 @@
#ifndef MBGL_STORAGE_REQUEST
#define MBGL_STORAGE_REQUEST
-#include <mbgl/storage/request_callback.hpp>
-#include <mbgl/storage/response.hpp>
+#include "request_callback.hpp"
+#include "response.hpp"
+
#include <mbgl/util/ptr.hpp>
#include <thread>
diff --git a/include/mbgl/storage/sqlite_store.hpp b/include/mbgl/storage/sqlite_store.hpp
deleted file mode 100644
index a691b474e0..0000000000
--- a/include/mbgl/storage/sqlite_store.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef MBGL_STORAGE_SQLITE_STORE
-#define MBGL_STORAGE_SQLITE_STORE
-
-#include <mbgl/storage/file_source.hpp>
-#include <mbgl/storage/response.hpp>
-
-#include <uv.h>
-
-#include <string>
-#include <thread>
-
-typedef struct uv_worker_s uv_worker_t;
-
-namespace mapbox {
-namespace sqlite {
-class Database;
-}
-}
-
-namespace mbgl {
-
-class SQLiteStore {
-public:
- SQLiteStore(uv_loop_t *loop, const std::string &path);
- ~SQLiteStore();
-
- typedef void (*GetCallback)(std::unique_ptr<Response> &&entry, void *ptr);
-
- void get(const std::string &path, GetCallback cb, void *ptr);
- void put(const std::string &path, ResourceType type, const Response &entry);
- void updateExpiration(const std::string &path, int64_t expires);
-
-private:
- void createSchema();
- void closeDatabase();
- static void runGet(uv_work_t *req);
- static void runPut(uv_work_t *req);
- static void deliverResult(uv_work_t *req, int status);
-
-private:
- const std::thread::id thread_id;
- util::ptr<mapbox::sqlite::Database> db;
- uv_worker_t *worker = nullptr;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/style/applied_class_properties.hpp b/include/mbgl/style/applied_class_properties.hpp
deleted file mode 100644
index 827f15a2a1..0000000000
--- a/include/mbgl/style/applied_class_properties.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef MBGL_STYLE_APPLIED_CLASS_PROPERTIES
-#define MBGL_STYLE_APPLIED_CLASS_PROPERTIES
-
-#include <mbgl/style/property_value.hpp>
-#include <mbgl/style/class_dictionary.hpp>
-#include <mbgl/util/time.hpp>
-
-#include <list>
-
-namespace mbgl {
-
-class AppliedClassProperty {
-public:
- AppliedClassProperty(ClassID class_id, timestamp begin, timestamp end, const PropertyValue &value);
-
-public:
- const ClassID name;
- const timestamp begin;
- const timestamp end;
- const PropertyValue value;
-};
-
-
-class AppliedClassProperties {
-public:
- std::list<AppliedClassProperty> properties;
-
-public:
- // Returns thie ID of the most recent
- ClassID mostRecent() const;
- void add(ClassID class_id, timestamp begin, timestamp end, const PropertyValue &value);
- bool hasTransitions() const;
- void cleanup(timestamp now);
- bool empty() const;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/style/class_dictionary.hpp b/include/mbgl/style/class_dictionary.hpp
deleted file mode 100644
index ecf80be3e3..0000000000
--- a/include/mbgl/style/class_dictionary.hpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef MBGL_STYLE_CLASS_DICTIONARY
-#define MBGL_STYLE_CLASS_DICTIONARY
-
-#include <cstdint>
-#include <string>
-#include <unordered_map>
-
-namespace mbgl {
-
-enum class ClassID : uint32_t {
- Fallback = 0, // These values are from the fallback properties
- Default = 1, // These values are from the default style for a layer
- Named = 2 // These values (and all subsequent IDs) are from a named style from the layer
-};
-
-class ClassDictionary {
-private:
- ClassDictionary();
-
-public:
- static ClassDictionary &Get();
-
- // Returns an ID for a class name. If the class name does not yet have an ID, one is
- // auto-generated and stored for future reference.
- ClassID lookup(const std::string &class_name);
-
- // Returns either Fallback, Default or Named, depending on the type of the class id.
- ClassID normalize(ClassID id);
-
-private:
- std::unordered_map<std::string, ClassID> store = { { "", ClassID::Default } };
- uint32_t offset = 0;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/style/class_properties.hpp b/include/mbgl/style/class_properties.hpp
deleted file mode 100644
index 888a90c5d7..0000000000
--- a/include/mbgl/style/class_properties.hpp
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef MBGL_STYLE_CLASS_PROPERTIES
-#define MBGL_STYLE_CLASS_PROPERTIES
-
-#include <mbgl/style/property_key.hpp>
-#include <mbgl/style/property_value.hpp>
-#include <mbgl/style/property_transition.hpp>
-
-#include <map>
-
-namespace mbgl {
-
-class ClassProperties {
-public:
- inline ClassProperties() {}
- inline ClassProperties(ClassProperties &&properties_)
- : properties(std::move(properties_.properties)) {}
-
- inline void set(PropertyKey key, const PropertyValue &value) {
- properties.emplace(key, value);
- }
-
- inline void set(PropertyKey key, const PropertyTransition &transition) {
- transitions.emplace(key, transition);
- }
-
- const PropertyTransition &getTransition(PropertyKey key, const PropertyTransition &defaultTransition) const;
-
- // Route-through iterable interface so that you can iterate on the object as is.
- inline std::map<PropertyKey, PropertyValue>::const_iterator begin() const {
- return properties.begin();
- }
- inline std::map<PropertyKey, PropertyValue>::const_iterator end() const {
- return properties.end();
- }
-
-public:
- std::map<PropertyKey, PropertyValue> properties;
- std::map<PropertyKey, PropertyTransition> transitions;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/style/filter_expression.hpp b/include/mbgl/style/filter_expression.hpp
deleted file mode 100644
index 8c6f447770..0000000000
--- a/include/mbgl/style/filter_expression.hpp
+++ /dev/null
@@ -1,125 +0,0 @@
-#ifndef MBGL_STYLE_FILTER_EXPRESSION
-#define MBGL_STYLE_FILTER_EXPRESSION
-
-#include <mbgl/style/value.hpp>
-
-#include <rapidjson/document.h>
-
-#include <string>
-#include <vector>
-
-namespace mbgl {
-
-typedef mapbox::util::variant<
- struct NullExpression,
- struct EqualsExpression,
- struct NotEqualsExpression,
- struct LessThanExpression,
- struct LessThanEqualsExpression,
- struct GreaterThanExpression,
- struct GreaterThanEqualsExpression,
- struct InExpression,
- struct NotInExpression,
- struct AnyExpression,
- struct AllExpression,
- struct NoneExpression
- > FilterExpression;
-
-FilterExpression parseFilterExpression(const rapidjson::Value&);
-
-template <class Extractor>
-bool evaluate(const FilterExpression&, const Extractor&);
-
-struct NullExpression {
- template <class Extractor>
- bool evaluate(const Extractor&) const { return true; }
-};
-
-struct EqualsExpression {
- std::string key;
- Value value;
-
- template <class Extractor>
- bool evaluate(const Extractor&) const;
-};
-
-struct NotEqualsExpression {
- std::string key;
- Value value;
-
- template <class Extractor>
- bool evaluate(const Extractor&) const;
-};
-
-struct LessThanExpression {
- std::string key;
- Value value;
-
- template <class Extractor>
- bool evaluate(const Extractor&) const;
-};
-
-struct LessThanEqualsExpression {
- std::string key;
- Value value;
-
- template <class Extractor>
- bool evaluate(const Extractor&) const;
-};
-
-struct GreaterThanExpression {
- std::string key;
- Value value;
-
- template <class Extractor>
- bool evaluate(const Extractor&) const;
-};
-
-struct GreaterThanEqualsExpression {
- std::string key;
- Value value;
-
- template <class Extractor>
- bool evaluate(const Extractor&) const;
-};
-
-struct InExpression {
- std::string key;
- std::vector<Value> values;
-
- template <class Extractor>
- bool evaluate(const Extractor&) const;
-};
-
-struct NotInExpression {
- std::string key;
- std::vector<Value> values;
-
- template <class Extractor>
- bool evaluate(const Extractor&) const;
-};
-
-struct AnyExpression {
- std::vector<FilterExpression> expressions;
-
- template <class Extractor>
- bool evaluate(const Extractor&) const;
-};
-
-struct AllExpression {
- std::vector<FilterExpression> expressions;
-
- template <class Extractor>
- bool evaluate(const Extractor&) const;
-};
-
-struct NoneExpression {
- std::vector<FilterExpression> expressions;
-
- template <class Extractor>
- bool evaluate(const Extractor&) const;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/style/filter_expression_private.hpp b/include/mbgl/style/filter_expression_private.hpp
deleted file mode 100644
index 381f8f617c..0000000000
--- a/include/mbgl/style/filter_expression_private.hpp
+++ /dev/null
@@ -1,118 +0,0 @@
-#include <mbgl/util/optional.hpp>
-#include <mbgl/style/value_comparison.hpp>
-
-namespace mbgl {
-
-template <class Extractor>
-struct Evaluator : public mapbox::util::static_visitor<bool>
-{
- const Extractor& extractor;
-
- Evaluator(const Extractor& extractor_)
- : extractor(extractor_) {}
-
- template <class E>
- bool operator()(const E& e) const { return e.evaluate(extractor); }
-};
-
-template <class Extractor>
-bool evaluate(const FilterExpression& expression, const Extractor& extractor) {
- return mapbox::util::apply_visitor(Evaluator<Extractor>(extractor), expression);
-};
-
-template <class Extractor>
-bool EqualsExpression::evaluate(const Extractor& extractor) const {
- mapbox::util::optional<Value> actual = extractor.getValue(key);
- return actual && util::relaxed_equal(*actual, value);
-}
-
-template <class Extractor>
-bool NotEqualsExpression::evaluate(const Extractor& extractor) const {
- mapbox::util::optional<Value> actual = extractor.getValue(key);
- return !actual || util::relaxed_not_equal(*actual, value);
-}
-
-template <class Extractor>
-bool LessThanExpression::evaluate(const Extractor& extractor) const {
- mapbox::util::optional<Value> actual = extractor.getValue(key);
- return actual && util::relaxed_less(*actual, value);
-}
-
-template <class Extractor>
-bool LessThanEqualsExpression::evaluate(const Extractor& extractor) const {
- mapbox::util::optional<Value> actual = extractor.getValue(key);
- return actual && util::relaxed_less_equal(*actual, value);
-}
-
-template <class Extractor>
-bool GreaterThanExpression::evaluate(const Extractor& extractor) const {
- mapbox::util::optional<Value> actual = extractor.getValue(key);
- return actual && util::relaxed_greater(*actual, value);
-}
-
-template <class Extractor>
-bool GreaterThanEqualsExpression::evaluate(const Extractor& extractor) const {
- mapbox::util::optional<Value> actual = extractor.getValue(key);
- return actual && util::relaxed_greater_equal(*actual, value);
-}
-
-template <class Extractor>
-bool InExpression::evaluate(const Extractor& extractor) const {
- mapbox::util::optional<Value> actual = extractor.getValue(key);
- if (!actual)
- return false;
- for (const auto& v: values) {
- if (util::relaxed_equal(*actual, v)) {
- return true;
- }
- }
- return false;
-}
-
-template <class Extractor>
-bool NotInExpression::evaluate(const Extractor& extractor) const {
- mapbox::util::optional<Value> actual = extractor.getValue(key);
- if (!actual)
- return true;
- for (const auto& v: values) {
- if (util::relaxed_equal(*actual, v)) {
- return false;
- }
- }
- return true;
-}
-
-template <class Extractor>
-bool AnyExpression::evaluate(const Extractor& extractor) const {
- Evaluator<Extractor> evaluator(extractor);
- for (const auto& e: expressions) {
- if (mapbox::util::apply_visitor(evaluator, e)) {
- return true;
- }
- }
- return false;
-}
-
-template <class Extractor>
-bool AllExpression::evaluate(const Extractor& extractor) const {
- Evaluator<Extractor> evaluator(extractor);
- for (const auto& e: expressions) {
- if (!mapbox::util::apply_visitor(evaluator, e)) {
- return false;
- }
- }
- return true;
-}
-
-template <class Extractor>
-bool NoneExpression::evaluate(const Extractor& extractor) const {
- Evaluator<Extractor> evaluator(extractor);
- for (const auto& e: expressions) {
- if (mapbox::util::apply_visitor(evaluator, e)) {
- return false;
- }
- }
- return true;
-}
-
-}
diff --git a/include/mbgl/style/function_properties.hpp b/include/mbgl/style/function_properties.hpp
deleted file mode 100644
index 924f192330..0000000000
--- a/include/mbgl/style/function_properties.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef MBGL_STYLE_FUNCTION_PROPERTIES
-#define MBGL_STYLE_FUNCTION_PROPERTIES
-
-#include <mbgl/util/variant.hpp>
-
-#include <vector>
-
-namespace mbgl {
-
-template <typename T>
-struct ConstantFunction {
- inline ConstantFunction(const T &value_) : value(value_) {}
- inline T evaluate(float) const { return value; }
-
-private:
- const T value;
-};
-
-template <typename T>
-struct StopsFunction {
- inline StopsFunction(const std::vector<std::pair<float, T>> &values_, float base_) : values(values_), base(base_) {}
- T evaluate(float z) const;
-
-private:
- const std::vector<std::pair<float, T>> values;
- const float base;
-};
-
-template <typename T>
-using Function = mapbox::util::variant<
- std::false_type,
- ConstantFunction<T>,
- StopsFunction<T>
->;
-
-template <typename T>
-struct FunctionEvaluator {
- typedef T result_type;
- inline FunctionEvaluator(float z_) : z(z_) {}
-
- inline result_type operator()(const std::false_type &) {
- return result_type();
- }
-
- template <template <typename> class Fn>
- inline result_type operator()(const Fn<T>& fn) {
- return fn.evaluate(z);
- }
-private:
- float z;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/style/property_fallback.hpp b/include/mbgl/style/property_fallback.hpp
deleted file mode 100644
index 5c5eae0cd6..0000000000
--- a/include/mbgl/style/property_fallback.hpp
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef MBGL_STYLE_PROPERTY_FALLBACK
-#define MBGL_STYLE_PROPERTY_FALLBACK
-
-#include <mbgl/style/property_key.hpp>
-#include <mbgl/style/property_value.hpp>
-
-#include <map>
-
-namespace mbgl {
-
-class PropertyFallbackValue {
-public:
- static const PropertyValue &Get(PropertyKey key) {
- auto it = properties.find(key);
- if (it != properties.end()) {
- return it->second;
- } else {
- return defaultProperty;
- }
- }
-
-private:
- static const std::map<PropertyKey, PropertyValue> properties;
- static const PropertyValue defaultProperty;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/style/property_key.hpp b/include/mbgl/style/property_key.hpp
deleted file mode 100644
index efeebf0242..0000000000
--- a/include/mbgl/style/property_key.hpp
+++ /dev/null
@@ -1,70 +0,0 @@
-#ifndef MBGL_STYLE_PROPERTY_KEY
-#define MBGL_STYLE_PROPERTY_KEY
-
-namespace mbgl {
-
-enum class PropertyKey {
- FillAntialias,
- FillOpacity,
- FillColor,
- FillOutlineColor,
- FillTranslate, // for transitions only
- FillTranslateX,
- FillTranslateY,
- FillTranslateAnchor,
- FillImage,
-
- LineOpacity,
- LineColor,
- LineTranslate, // for transitions only
- LineTranslateX,
- LineTranslateY,
- LineTranslateAnchor,
- LineWidth,
- LineGapWidth,
- LineBlur,
- LineDashArray, // for transitions only
- LineDashLand,
- LineDashGap,
- LineImage,
-
- IconOpacity,
- IconRotate,
- IconSize,
- IconColor,
- IconHaloColor,
- IconHaloWidth,
- IconHaloBlur,
- IconTranslate, // for transitions only
- IconTranslateX,
- IconTranslateY,
- IconTranslateAnchor,
-
- TextOpacity,
- TextSize,
- TextColor,
- TextHaloColor,
- TextHaloWidth,
- TextHaloBlur,
- TextTranslate, // for transitions only
- TextTranslateX,
- TextTranslateY,
- TextTranslateAnchor,
-
- RasterOpacity,
- RasterHueRotate,
- RasterBrightness, // for transitions only
- RasterBrightnessLow,
- RasterBrightnessHigh,
- RasterSaturation,
- RasterContrast,
- RasterFade,
-
- BackgroundOpacity,
- BackgroundColor,
- BackgroundImage
-};
-
-}
-
-#endif
diff --git a/include/mbgl/style/property_transition.hpp b/include/mbgl/style/property_transition.hpp
deleted file mode 100644
index 07b7cfe288..0000000000
--- a/include/mbgl/style/property_transition.hpp
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef MBGL_STYLE_PROPERTY_TRANSITION
-#define MBGL_STYLE_PROPERTY_TRANSITION
-
-#include <cstdint>
-
-namespace mbgl {
-
-struct PropertyTransition {
- uint16_t duration = 0;
- uint16_t delay = 0;
-};
-
-}
-
-#endif \ No newline at end of file
diff --git a/include/mbgl/style/property_value.hpp b/include/mbgl/style/property_value.hpp
deleted file mode 100644
index 1b22b31177..0000000000
--- a/include/mbgl/style/property_value.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef MBGL_STYLE_PROPERTY_VALUE
-#define MBGL_STYLE_PROPERTY_VALUE
-
-#include <mbgl/util/variant.hpp>
-#include <mbgl/style/function_properties.hpp>
-#include <mbgl/style/types.hpp>
-
-namespace mbgl {
-
-typedef mapbox::util::variant<
- std::string,
- TranslateAnchorType,
- RotateAnchorType,
- Function<bool>,
- Function<float>,
- Function<Color>
-> PropertyValue;
-
-}
-
-#endif
diff --git a/include/mbgl/style/style.hpp b/include/mbgl/style/style.hpp
deleted file mode 100644
index 56f318ecbb..0000000000
--- a/include/mbgl/style/style.hpp
+++ /dev/null
@@ -1,68 +0,0 @@
-#ifndef MBGL_STYLE_STYLE
-#define MBGL_STYLE_STYLE
-
-#include <mbgl/style/property_transition.hpp>
-#include <mbgl/style/style_source.hpp>
-
-#include <mbgl/util/time.hpp>
-#include <mbgl/util/uv.hpp>
-#include <mbgl/util/ptr.hpp>
-
-#include <cstdint>
-#include <map>
-#include <string>
-#include <unordered_map>
-#include <vector>
-#include <set>
-
-namespace mbgl {
-
-class Sprite;
-class StyleLayer;
-class StyleLayerGroup;
-
-class Style {
-public:
- struct exception : std::runtime_error { exception(const char *msg) : std::runtime_error(msg) {} };
-
-public:
- Style();
- ~Style();
-
- void loadJSON(const uint8_t *const data);
-
- size_t layerCount() const;
- void updateProperties(float z, timestamp t);
-
- void setDefaultTransitionDuration(uint16_t duration_milliseconds = 0);
-
- void setAppliedClasses(const std::vector<std::string> &classes);
- const std::vector<std::string> &getAppliedClasses() const;
- void toggleClass(const std::string &name);
-
- // Updates the styling information to reflect the current array
- // of applied classes.
- void updateClasses();
-
- bool hasTransitions() const;
-
- const std::string &getSpriteURL() const;
-
-public:
- util::ptr<StyleLayerGroup> layers;
- std::vector<std::string> appliedClasses;
- std::string glyph_url;
-
-private:
- std::string sprite_url;
-
-private:
- PropertyTransition defaultTransition;
- bool initial_render_complete = false;
-
- std::unique_ptr<uv::rwlock> mtx;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/style/style_bucket.hpp b/include/mbgl/style/style_bucket.hpp
deleted file mode 100644
index d84d35d5b2..0000000000
--- a/include/mbgl/style/style_bucket.hpp
+++ /dev/null
@@ -1,112 +0,0 @@
-#ifndef MBGL_STYLE_STYLE_BUCKET
-#define MBGL_STYLE_STYLE_BUCKET
-
-#include <mbgl/style/types.hpp>
-#include <mbgl/style/filter_expression.hpp>
-#include <mbgl/style/style_source.hpp>
-
-#include <mbgl/util/vec.hpp>
-#include <mbgl/util/variant.hpp>
-#include <mbgl/util/noncopyable.hpp>
-#include <mbgl/util/ptr.hpp>
-
-#include <forward_list>
-
-namespace mbgl {
-
-class Source;
-
-class StyleBucketFill {
-public:
- WindingType winding = WindingType::NonZero;
-};
-
-class StyleBucketLine {
-public:
- CapType cap = CapType::Butt;
- JoinType join = JoinType::Miter;
- float miter_limit = 2.0f;
- float round_limit = 1.0f;
-};
-
-class StyleBucketSymbol {
-public:
- // Make movable only.
- inline StyleBucketSymbol() = default;
- inline StyleBucketSymbol(StyleBucketSymbol &&) = default;
- inline StyleBucketSymbol& operator=(StyleBucketSymbol &&) = default;
- inline StyleBucketSymbol(const StyleBucketSymbol &) = delete;
- inline StyleBucketSymbol& operator=(const StyleBucketSymbol &) = delete;
-
- PlacementType placement = PlacementType::Point;
- float min_distance = 250.0f;
- bool avoid_edges = false;
-
- struct {
- bool allow_overlap = false;
- bool ignore_placement = false;
- bool optional = false;
- RotationAlignmentType rotation_alignment = RotationAlignmentType::Viewport;
- float max_size = 1.0f;
- std::string image;
- float rotate = 0.0f;
- float padding = 2.0f;
- bool keep_upright = false;
- vec2<float> offset = {0, 0};
- } icon;
-
- struct {
- RotationAlignmentType rotation_alignment = RotationAlignmentType::Viewport;
- std::string field;
- std::string font;
- float max_size = 16.0f;
- float max_width = 15.0f * 24 /* em */;
- float line_height = 1.2f * 24 /* em */;
- float letter_spacing = 0.0f * 24 /* em */;
- TextJustifyType justify = TextJustifyType::Center;
- TextAnchorType anchor = TextAnchorType::Center;
- float max_angle = 45.0f /* degrees */;
- float rotate = 0.0f;
- float slant = 0.0f;
- float padding = 2.0f;
- bool keep_upright = true;
- TextTransformType transform = TextTransformType::None;
- vec2<float> offset = {0, 0};
- bool allow_overlap = false;
- bool ignore_placement = false;
- bool optional = false;
- } text;
-};
-
-class StyleBucketRaster {
-public:
- bool prerendered = false;
- uint16_t size = 256;
- float blur = 0.0f;
- float buffer = 0.03125f;
-};
-
-typedef mapbox::util::variant<StyleBucketFill, StyleBucketLine, StyleBucketSymbol,
- StyleBucketRaster, std::false_type> StyleBucketRender;
-
-
-class StyleBucket {
-public:
- typedef util::ptr<StyleBucket> Ptr;
-
- StyleBucket(StyleLayerType type);
-
- std::string name;
- util::ptr<StyleSource> style_source;
- std::string source_layer;
- FilterExpression filter;
- StyleBucketRender render = std::false_type();
- float min_zoom = -std::numeric_limits<float>::infinity();
- float max_zoom = std::numeric_limits<float>::infinity();
-};
-
-
-
-};
-
-#endif
diff --git a/include/mbgl/style/style_layer.hpp b/include/mbgl/style/style_layer.hpp
deleted file mode 100644
index 641dc1e71c..0000000000
--- a/include/mbgl/style/style_layer.hpp
+++ /dev/null
@@ -1,89 +0,0 @@
-#ifndef MBGL_STYLE_STYLE_LAYER
-#define MBGL_STYLE_STYLE_LAYER
-
-#include <mbgl/style/class_dictionary.hpp>
-#include <mbgl/style/class_properties.hpp>
-#include <mbgl/style/style_properties.hpp>
-#include <mbgl/style/applied_class_properties.hpp>
-
-#include <mbgl/util/ptr.hpp>
-
-#include <vector>
-#include <string>
-#include <map>
-#include <set>
-
-namespace mbgl {
-
-class StyleBucket;
-class StyleLayerGroup;
-
-class StyleLayer {
-public:
- StyleLayer(const std::string &id, std::map<ClassID, ClassProperties> &&styles);
-
- template <typename T> const T &getProperties() {
- if (properties.is<T>()) {
- return properties.get<T>();
- } else {
- return defaultStyleProperties<T>();
- }
- }
-
- // Determines whether this layer is the background layer.
- bool isBackground() const;
-
- // Updates the StyleProperties information in this layer by evaluating all
- // pending transitions and applied classes in order.
- void updateProperties(float z, timestamp now);
-
- // Sets the list of classes and creates transitions to the currently applied values.
- void setClasses(const std::vector<std::string> &class_names, timestamp now,
- const PropertyTransition &defaultTransition);
-
- bool hasTransitions() const;
-
-private:
- // Applies all properties from a class, if they haven't been applied already.
- void applyClassProperties(ClassID class_id, std::set<PropertyKey> &already_applied,
- timestamp now, const PropertyTransition &defaultTransition);
-
- // Sets the properties of this object by evaluating all pending transitions and
- // aplied classes in order.
- template <typename T> void applyStyleProperties(float z, timestamp now);
- template <typename T> void applyStyleProperty(PropertyKey key, T &, float z, timestamp now);
- template <typename T> void applyTransitionedStyleProperty(PropertyKey key, T &, float z, timestamp now);
-
- // Removes all expired style transitions.
- void cleanupAppliedStyleProperties(timestamp now);
-
-public:
- // The name of this layer.
- const std::string id;
-
- StyleLayerType type = StyleLayerType::Unknown;
-
- // Bucket information, telling the renderer how to generate the geometries
- // for this layer (feature property filters, tessellation instructions, ...).
- util::ptr<StyleBucket> bucket;
-
- // Contains all style classes that can be applied to this layer.
- const std::map<ClassID, ClassProperties> styles;
-
-private:
- // For every property, stores a list of applied property values, with
- // optional transition times.
- std::map<PropertyKey, AppliedClassProperties> appliedStyle;
-
-public:
- // Stores the evaluated, and cascaded styling information, specific to this
- // layer's type.
- StyleProperties properties;
-
- // Child layer array (if this layer has child layers).
- util::ptr<StyleLayerGroup> layers;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/style/style_layer_group.hpp b/include/mbgl/style/style_layer_group.hpp
deleted file mode 100644
index 1af6e23bd7..0000000000
--- a/include/mbgl/style/style_layer_group.hpp
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef MBGL_STYLE_STYLE_LAYER_GROUP
-#define MBGL_STYLE_STYLE_LAYER_GROUP
-
-#include <mbgl/style/style_layer.hpp>
-
-#include <vector>
-
-namespace mbgl {
-
-class StyleLayerGroup {
-public:
- void setClasses(const std::vector<std::string> &class_names, timestamp now,
- const PropertyTransition &defaultTransition);
- void updateProperties(float z, timestamp t);
-
- bool hasTransitions() const;
-public:
- std::vector<util::ptr<StyleLayer>> layers;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/style/style_parser.hpp b/include/mbgl/style/style_parser.hpp
deleted file mode 100644
index c37e856034..0000000000
--- a/include/mbgl/style/style_parser.hpp
+++ /dev/null
@@ -1,113 +0,0 @@
-#ifndef MBGL_STYLE_STYLE_PARSER
-#define MBGL_STYLE_STYLE_PARSER
-
-#include <rapidjson/document.h>
-#include <mbgl/style/style.hpp>
-#include <mbgl/style/style_source.hpp>
-#include <mbgl/style/filter_expression.hpp>
-#include <mbgl/style/class_properties.hpp>
-#include <mbgl/style/style_bucket.hpp>
-
-#include <unordered_map>
-#include <forward_list>
-#include <tuple>
-
-namespace mbgl {
-
-enum class ClassID : uint32_t;
-
-class StyleLayer;
-class StyleLayerGroup;
-
-class StyleParser {
-public:
- using JSVal = const rapidjson::Value&;
-
- StyleParser();
-
- void parse(JSVal document);
-
- util::ptr<StyleLayerGroup> getLayers() {
- return root;
- }
-
- std::string getSprite() const {
- return sprite;
- }
-
- std::string getGlyphURL() const {
- return glyph_url;
- }
-
-private:
- void parseConstants(JSVal value);
- JSVal replaceConstant(JSVal value);
-
- void parseSources(JSVal value);
-
- std::unique_ptr<StyleLayerGroup> createLayers(JSVal value);
- util::ptr<StyleLayer> createLayer(JSVal value);
- void parseLayers();
- void parseLayer(std::pair<JSVal, util::ptr<StyleLayer>> &pair);
- void parsePaints(JSVal value, std::map<ClassID, ClassProperties> &paints);
- void parsePaint(JSVal, ClassProperties &properties);
- void parseReference(JSVal value, util::ptr<StyleLayer> &layer);
- void parseBucket(JSVal value, util::ptr<StyleLayer> &layer);
- void parseLayout(JSVal value, util::ptr<StyleLayer> &layer);
- void parseSprite(JSVal value);
- void parseGlyphURL(JSVal value);
-
- // Parses optional properties into a render bucket.
- template<typename T>
- bool parseRenderProperty(JSVal value, T &target, const char *name);
- template <typename Parser, typename T>
- bool parseRenderProperty(JSVal value, T &target, const char *name);
-
- // Parses optional properties into style class properties.
- template <typename T>
- bool parseOptionalProperty(const char *property_name, PropertyKey key, ClassProperties &klass, JSVal value);
- template <typename T>
- bool parseOptionalProperty(const char *property_name, const std::vector<PropertyKey> &keys, ClassProperties &klass, JSVal value);
- template <typename T>
- bool parseOptionalProperty(const char *property_name, T &target, JSVal value);
- template <typename T>
- bool setProperty(JSVal value, const char *property_name, PropertyKey key, ClassProperties &klass);
- template <typename T>
- bool setProperty(JSVal value, const char *property_name, T &target);
-
- template <typename T>
- std::tuple<bool, T> parseProperty(JSVal value, const char *property_name);
-
- template <typename T>
- bool parseFunction(PropertyKey key, ClassProperties &klass, JSVal value);
- template <typename T>
- std::tuple<bool, Function<T>> parseFunction(JSVal value);
- template <typename T>
- T parseFunctionArgument(JSVal value);
-
- FilterExpression parseFilter(JSVal);
-
-private:
- std::unordered_map<std::string, const rapidjson::Value *> constants;
-
- std::unordered_map<std::string, const util::ptr<StyleSource>> sources;
-
- // This stores the root layer.
- util::ptr<StyleLayerGroup> root;
-
- // This maps ids to Layer objects, with all items being at the root level.
- std::unordered_map<std::string, std::pair<JSVal, util::ptr<StyleLayer>>> layers;
-
- // Store a stack of layers we're parsing right now. This is to prevent reference cycles.
- std::forward_list<StyleLayer *> stack;
-
- // Base URL of the sprite image.
- std::string sprite;
-
- // URL template for glyph PBFs.
- std::string glyph_url;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/style/style_properties.hpp b/include/mbgl/style/style_properties.hpp
deleted file mode 100644
index c44b7c34c8..0000000000
--- a/include/mbgl/style/style_properties.hpp
+++ /dev/null
@@ -1,114 +0,0 @@
-#ifndef MBGL_STYLE_STYLE_PROPERTIES
-#define MBGL_STYLE_STYLE_PROPERTIES
-
-#include <mbgl/util/variant.hpp>
-#include <mbgl/style/types.hpp>
-#include <mbgl/style/function_properties.hpp>
-
-#include <array>
-#include <string>
-#include <type_traits>
-#include <memory>
-
-namespace mbgl {
-
-struct FillProperties {
- FillProperties() {}
- bool antialias = true;
- float opacity = 1.0f;
- Color fill_color = {{ 0, 0, 0, 1 }};
- Color stroke_color = {{ 0, 0, 0, -1 }};
- std::array<float, 2> translate = {{ 0, 0 }};
- TranslateAnchorType translateAnchor = TranslateAnchorType::Map;
- std::string image;
-
- inline bool isVisible() const {
- return opacity > 0 && (fill_color[3] > 0 || stroke_color[3] > 0);
- }
-};
-
-struct LineProperties {
- inline LineProperties() {}
- float opacity = 1.0f;
- Color color = {{ 0, 0, 0, 1 }};
- std::array<float, 2> translate = {{ 0, 0 }};
- TranslateAnchorType translateAnchor = TranslateAnchorType::Map;
- float width = 1;
- float gap_width = 0;
- float blur = 0;
- std::array<float, 2> dash_array = {{ 1, -1 }};
- std::string image;
-
- inline bool isVisible() const {
- return opacity > 0 && color[3] > 0 && width > 0;
- }
-};
-
-struct SymbolProperties {
- inline SymbolProperties() {}
-
- struct {
- float opacity = 1.0f;
- float rotate = 0.0f;
- float size = 1.0f;
- Color color = {{ 0, 0, 0, 1 }};
- Color halo_color = {{ 0, 0, 0, 0 }};
- float halo_width = 0.0f;
- float halo_blur = 0.0f;
- std::array<float, 2> translate = {{ 0, 0 }};
- TranslateAnchorType translate_anchor = TranslateAnchorType::Map;
- } icon;
-
- struct {
- float opacity = 1.0f;
- float size = 16.0f;
- Color color = {{ 0, 0, 0, 1 }};
- Color halo_color = {{ 0, 0, 0, 0 }};
- float halo_width = 0.0f;
- float halo_blur = 0.0f;
- std::array<float, 2> translate = {{ 0, 0 }};
- TranslateAnchorType translate_anchor = TranslateAnchorType::Map;
- } text;
-
- inline bool isVisible() const {
- return (icon.opacity > 0 && (icon.color[3] > 0 || icon.halo_color[3] > 0) && icon.size > 0) ||
- (text.opacity > 0 && (text.color[3] > 0 || text.halo_color[3] > 0) && text.size > 0);
- }
-};
-
-struct RasterProperties {
- inline RasterProperties() {}
- float opacity = 1.0f;
- float hue_rotate = 0.0f;
- std::array<float, 2> brightness = {{ 0, 1 }};
- float saturation = 0.0f;
- float contrast = 0.0f;
- float fade = 0.0f;
-
- inline bool isVisible() const {
- return opacity > 0;
- }
-};
-
-struct BackgroundProperties {
- inline BackgroundProperties() {}
- float opacity = 1.0f;
- Color color = {{ 0, 0, 0, 1 }};
- std::string image;
-};
-
-typedef mapbox::util::variant<
- FillProperties,
- LineProperties,
- SymbolProperties,
- RasterProperties,
- BackgroundProperties,
- std::false_type
-> StyleProperties;
-
-template <typename T>
-const T &defaultStyleProperties();
-
-}
-
-#endif
diff --git a/include/mbgl/style/style_source.hpp b/include/mbgl/style/style_source.hpp
deleted file mode 100644
index 8c7d028880..0000000000
--- a/include/mbgl/style/style_source.hpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef MBGL_STYLE_STYLE_SOURCE
-#define MBGL_STYLE_STYLE_SOURCE
-
-#include <mbgl/style/types.hpp>
-#include <mbgl/util/ptr.hpp>
-#include <mbgl/util/noncopyable.hpp>
-#include <rapidjson/document.h>
-
-#include <vector>
-#include <string>
-
-namespace mbgl {
-
-class Source;
-
-class SourceInfo : private util::noncopyable {
-public:
- SourceType type = SourceType::Vector;
- std::string url;
- std::vector<std::string> tiles;
- uint16_t tile_size = 512;
- uint16_t min_zoom = 0;
- uint16_t max_zoom = 22;
- std::string attribution;
- std::array<float, 3> center = {{0, 0, 0}};
- std::array<float, 4> bounds = {{-180, -90, 180, 90}};
-
- void parseTileJSONProperties(const rapidjson::Value&);
-};
-
-
-class StyleSource : private util::noncopyable {
-public:
- SourceInfo info;
- bool enabled = false;
- util::ptr<Source> source;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/style/types.hpp b/include/mbgl/style/types.hpp
deleted file mode 100644
index 2f7ca7683d..0000000000
--- a/include/mbgl/style/types.hpp
+++ /dev/null
@@ -1,196 +0,0 @@
-#ifndef MBGL_STYLE_TYPES
-#define MBGL_STYLE_TYPES
-
-#include <mbgl/util/enum.hpp>
-
-#include <string>
-#include <array>
-
-namespace mbgl {
-
-// Stores a premultiplied color, with all four channels ranging from 0..1
-typedef std::array<float, 4> Color;
-
-// -------------------------------------------------------------------------------------------------
-
-enum class StyleLayerType : uint8_t {
- Unknown,
- Fill,
- Line,
- Symbol,
- Raster,
- Background
-};
-
-MBGL_DEFINE_ENUM_CLASS(StyleLayerTypeClass, StyleLayerType, {
- { StyleLayerType::Unknown, "unknown" },
- { StyleLayerType::Fill, "fill" },
- { StyleLayerType::Line, "line" },
- { StyleLayerType::Symbol, "symbol" },
- { StyleLayerType::Raster, "raster" },
- { StyleLayerType::Background, "background" },
- { StyleLayerType(-1), "unknown" },
-});
-
-// -------------------------------------------------------------------------------------------------
-
-enum class SourceType : uint8_t {
- Vector,
- Raster,
- GeoJSON,
- Video
-};
-
-MBGL_DEFINE_ENUM_CLASS(SourceTypeClass, SourceType, {
- { SourceType::Vector, "vector" },
- { SourceType::Raster, "raster" },
- { SourceType::GeoJSON, "geojson" },
- { SourceType::Video, "video" },
-});
-
-// -------------------------------------------------------------------------------------------------
-
-enum class WindingType : bool {
- EvenOdd,
- NonZero,
-};
-
-MBGL_DEFINE_ENUM_CLASS(WindingTypeClass, WindingType, {
- { WindingType::EvenOdd, "even-odd" },
- { WindingType::NonZero, "non-zero" },
-});
-
-// -------------------------------------------------------------------------------------------------
-
-enum class CapType : uint8_t {
- Round,
- Butt,
- Square,
-};
-
-MBGL_DEFINE_ENUM_CLASS(CapTypeClass, CapType, {
- { CapType::Round, "round" },
- { CapType::Butt, "butt" },
- { CapType::Square, "square" },
-});
-
-// -------------------------------------------------------------------------------------------------
-
-enum class JoinType : uint8_t {
- Miter,
- Bevel,
- Round
-};
-
-MBGL_DEFINE_ENUM_CLASS(JoinTypeClass, JoinType, {
- { JoinType::Miter, "miter" },
- { JoinType::Bevel, "bevel" },
- { JoinType::Round, "round" },
-});
-
-// -------------------------------------------------------------------------------------------------
-
-enum class TranslateAnchorType : bool {
- Map,
- Viewport
-};
-
-MBGL_DEFINE_ENUM_CLASS(TranslateAnchorTypeClass, TranslateAnchorType, {
- { TranslateAnchorType::Map, "map" },
- { TranslateAnchorType::Viewport, "viewport" },
-});
-
-// -------------------------------------------------------------------------------------------------
-
-enum class RotateAnchorType : bool {
- Map,
- Viewport,
-};
-
-MBGL_DEFINE_ENUM_CLASS(RotateAnchorTypeClass, RotateAnchorType, {
- { RotateAnchorType::Map, "map" },
- { RotateAnchorType::Viewport, "viewport" },
-});
-
-// -------------------------------------------------------------------------------------------------
-
-enum class PlacementType : bool {
- Point,
- Line,
-};
-
-MBGL_DEFINE_ENUM_CLASS(PlacementTypeClass, PlacementType, {
- { PlacementType::Point, "point" },
- { PlacementType::Line, "line" },
-});
-
-// -------------------------------------------------------------------------------------------------
-
-enum class RotationAlignmentType : bool {
- Map,
- Viewport,
-};
-
-MBGL_DEFINE_ENUM_CLASS(RotationAlignmentTypeClass, RotationAlignmentType, {
- { RotationAlignmentType::Map, "map" },
- { RotationAlignmentType::Viewport, "viewport" },
-});
-
-// -------------------------------------------------------------------------------------------------
-
-enum class TextJustifyType : uint8_t {
- Center,
- Left,
- Right
-};
-
-MBGL_DEFINE_ENUM_CLASS(TextJustifyTypeClass, TextJustifyType, {
- { TextJustifyType::Center, "center" },
- { TextJustifyType::Left, "left" },
- { TextJustifyType::Right, "right" },
-});
-
-// -------------------------------------------------------------------------------------------------
-
-enum class TextAnchorType : uint8_t {
- Center,
- Left,
- Right,
- Top,
- Bottom,
- TopLeft,
- TopRight,
- BottomLeft,
- BottomRight
-};
-
-MBGL_DEFINE_ENUM_CLASS(TextAnchorTypeClass, TextAnchorType, {
- { TextAnchorType::Center, "center" },
- { TextAnchorType::Left, "left" },
- { TextAnchorType::Right, "right" },
- { TextAnchorType::Top, "top" },
- { TextAnchorType::Bottom, "bottom" },
- { TextAnchorType::TopLeft, "top-left" },
- { TextAnchorType::TopRight, "top-right" },
- { TextAnchorType::BottomLeft, "bottom-left" },
- { TextAnchorType::BottomRight, "bottom-right" }
-});
-
-// -------------------------------------------------------------------------------------------------
-
-enum class TextTransformType : uint8_t {
- None,
- Uppercase,
- Lowercase,
-};
-
-MBGL_DEFINE_ENUM_CLASS(TextTransformTypeClass, TextTransformType, {
- { TextTransformType::None, "none" },
- { TextTransformType::Uppercase, "uppercase" },
- { TextTransformType::Lowercase, "lowercase" },
-});
-
-}
-
-#endif
-
diff --git a/include/mbgl/style/value.hpp b/include/mbgl/style/value.hpp
deleted file mode 100644
index 87d6f4cda3..0000000000
--- a/include/mbgl/style/value.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef MBGL_STYLE_VALUE
-#define MBGL_STYLE_VALUE
-
-#include <mbgl/util/variant.hpp>
-#include <mbgl/util/pbf.hpp>
-#include <rapidjson/document.h>
-
-#include <cstdlib>
-#include <cerrno>
-
-namespace mbgl {
-
-typedef mapbox::util::variant<bool, int64_t, uint64_t, double, std::string> Value;
-
-std::string toString(const Value &value);
-
-Value parseValue(pbf data);
-Value parseValue(const rapidjson::Value&);
-
-namespace util {
-inline bool parseNumericString(const std::string &str, double &result) {
- char *end = nullptr;
- const char *begin = str.c_str();
- result = std::strtod(begin, &end);
- while (*end != '\0' && isspace(*end)) end++; // eat whitespace after the end
- return errno == 0 && end - begin == long(str.size());
-}
-}
-
-template <typename T>
-T toNumber(const Value &value) {
- if (value.is<std::string>()) {
- double val;
- return util::parseNumericString(value.get<std::string>(), val) ? val : 0;
- }
- else if (value.is<bool>()) return value.get<bool>();
- else if (value.is<int64_t>()) return value.get<int64_t>();
- else if (value.is<uint64_t>()) return value.get<uint64_t>();
- else if (value.is<double>()) return value.get<double>();
- else return 0;
-}
-
-}
-
-#endif
diff --git a/include/mbgl/style/value_comparison.hpp b/include/mbgl/style/value_comparison.hpp
deleted file mode 100644
index 98e29afa7c..0000000000
--- a/include/mbgl/style/value_comparison.hpp
+++ /dev/null
@@ -1,109 +0,0 @@
-#ifndef MBGL_STYLE_VALUE_COMPARISON
-#define MBGL_STYLE_VALUE_COMPARISON
-
-#include "value.hpp"
-#include <cstdlib>
-#include <cerrno>
-
-namespace mbgl {
-
-namespace util {
-
-namespace detail {
-
-template <typename Operator>
-struct relaxed_operator_visitor {
- typedef bool result_type;
-
- template <typename T0, typename T1>
- inline bool operator()(T0, T1) const { return false; }
-
- template <typename T>
- inline bool operator()(T lhs, T rhs) const { return Operator()(lhs, rhs); }
-
- inline bool operator()(int64_t lhs, uint64_t rhs) const {
- return Operator()(double(lhs), double(rhs));
- }
-
- inline bool operator()(int64_t lhs, double rhs) const {
- return Operator()(double(lhs), rhs);
- }
-
- inline bool operator()(uint64_t lhs, int64_t rhs) const {
- return Operator()(double(lhs), double(rhs));
- }
-
- inline bool operator()(uint64_t lhs, double rhs) const {
- return Operator()(double(lhs), rhs);
- }
-
- inline bool operator()(double lhs, uint64_t rhs) const {
- return Operator()(lhs, double(rhs));
- }
-
- inline bool operator()(double lhs, int64_t rhs) const {
- return Operator()(lhs, double(rhs));
- }
-};
-
-struct relaxed_equal_operator {
- template <typename T0, typename T1>
- inline bool operator()(T0 lhs, T1 rhs) const { return lhs == rhs; }
-};
-
-struct relaxed_not_equal_operator {
- template <typename T0, typename T1>
- inline bool operator()(T0 lhs, T1 rhs) const { return lhs != rhs; }
-};
-
-struct relaxed_greater_operator {
- template <typename T0, typename T1>
- inline bool operator()(T0 lhs, T1 rhs) const { return lhs > rhs; }
-};
-
-struct relaxed_greater_equal_operator {
- template <typename T0, typename T1>
- inline bool operator()(T0 lhs, T1 rhs) const { return lhs >= rhs; }
-};
-
-struct relaxed_less_operator {
- template <typename T0, typename T1>
- inline bool operator()(T0 lhs, T1 rhs) const { return lhs < rhs; }
-};
-
-struct relaxed_less_equal_operator {
- template <typename T0, typename T1>
- inline bool operator()(T0 lhs, T1 rhs) const { return lhs <= rhs; }
-};
-
-} // end namespace detail
-
-inline bool relaxed_equal(Value const &lhs, Value const &rhs) {
- return apply_visitor(detail::relaxed_operator_visitor<detail::relaxed_equal_operator>(), lhs, rhs);
-}
-
-inline bool relaxed_not_equal(Value const &lhs, Value const &rhs) {
- return apply_visitor(detail::relaxed_operator_visitor<detail::relaxed_not_equal_operator>(), lhs, rhs);
-}
-
-inline bool relaxed_greater(Value const &lhs, Value const &rhs) {
- return apply_visitor(detail::relaxed_operator_visitor<detail::relaxed_greater_operator>(), lhs, rhs);
-}
-
-inline bool relaxed_greater_equal(Value const &lhs, Value const &rhs) {
- return apply_visitor(detail::relaxed_operator_visitor<detail::relaxed_greater_equal_operator>(), lhs, rhs);
-}
-
-inline bool relaxed_less(Value const &lhs, Value const &rhs) {
- return apply_visitor(detail::relaxed_operator_visitor<detail::relaxed_less_operator>(), lhs, rhs);
-}
-
-inline bool relaxed_less_equal(Value const &lhs, Value const &rhs) {
- return apply_visitor(detail::relaxed_operator_visitor<detail::relaxed_less_equal_operator>(), lhs, rhs);
-}
-
-}
-
-}
-
-#endif
diff --git a/include/mbgl/text/collision.hpp b/include/mbgl/text/collision.hpp
deleted file mode 100644
index 3bf37a6a12..0000000000
--- a/include/mbgl/text/collision.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef MBGL_TEXT_COLLISION
-#define MBGL_TEXT_COLLISION
-
-#include <mbgl/text/types.hpp>
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-#pragma GCC diagnostic ignored "-Wunused-variable"
-#pragma GCC diagnostic ignored "-Wshadow"
-#ifdef __clang__
-#pragma GCC diagnostic ignored "-Wdeprecated-register"
-#else
-#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
-#endif
-#include <boost/geometry.hpp>
-#include <boost/geometry/geometries/point.hpp>
-#include <boost/geometry/geometries/box.hpp>
-#include <boost/geometry/index/rtree.hpp>
-#pragma GCC diagnostic pop
-
-namespace mbgl {
-
-namespace bg = boost::geometry;
-namespace bgm = bg::model;
-namespace bgi = bg::index;
-typedef bgm::point<float, 2, bg::cs::cartesian> Point;
-typedef bgm::box<Point> Box;
-typedef std::pair<Box, PlacementBox> PlacementValue;
-typedef bgi::rtree<PlacementValue, bgi::linear<16,4>> Tree;
-
-class Collision {
-
-public:
- Collision(float zoom, float tileExtent, float tileSize, float placementDepth = 1);
-
- float getPlacementScale(const GlyphBoxes &glyphs, float minPlacementScale, bool avoidEdges);
- PlacementRange getPlacementRange(const GlyphBoxes &glyphs, float placementScale,
- bool horizontal);
- void insert(const GlyphBoxes &glyphs, const CollisionAnchor &anchor, float placementScale,
- const PlacementRange &placementRange, bool horizontal);
-
-private:
- Tree hTree;
- Tree cTree;
- PlacementValue leftEdge;
- PlacementValue topEdge;
- PlacementValue rightEdge;
- PlacementValue bottomEdge;
-
-public:
- const float tilePixelRatio;
- const float zoom;
- const float maxPlacementScale;
-};
-}
-
-#endif
diff --git a/include/mbgl/text/glyph.hpp b/include/mbgl/text/glyph.hpp
deleted file mode 100644
index 4fbb75fc1e..0000000000
--- a/include/mbgl/text/glyph.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef MBGL_TEXT_GLYPH
-#define MBGL_TEXT_GLYPH
-
-#include <mbgl/util/rect.hpp>
-
-#include <cstdint>
-#include <vector>
-#include <map>
-
-namespace mbgl {
-
-typedef std::pair<uint16_t, uint16_t> GlyphRange;
-
-// Note: this only works for the BMP
-GlyphRange getGlyphRange(char32_t glyph);
-
-struct GlyphMetrics {
- operator bool() const {
- return !(width == 0 && height == 0 && advance == 0);
- }
-
- // Glyph metrics.
- uint32_t width = 0;
- uint32_t height = 0;
- int32_t left = 0;
- int32_t top = 0;
- uint32_t advance = 0;
-
-};
-
-struct Glyph {
- inline explicit Glyph() : rect(0, 0, 0, 0), metrics() {}
- inline explicit Glyph(const Rect<uint16_t> &rect_,
- const GlyphMetrics &metrics_)
- : rect(rect_), metrics(metrics_) {}
-
- operator bool() const {
- return metrics || rect;
- }
-
- const Rect<uint16_t> rect;
- const GlyphMetrics metrics;
-};
-
-typedef std::map<uint32_t, Glyph> GlyphPositions;
-
-class PositionedGlyph {
-public:
- inline explicit PositionedGlyph(uint32_t glyph_, float x_, float y_)
- : glyph(glyph_), x(x_), y(y_) {}
-
- uint32_t glyph = 0;
- float x = 0;
- float y = 0;
-};
-
-typedef std::vector<PositionedGlyph> Shaping;
-}
-
-#endif
diff --git a/include/mbgl/text/glyph_store.hpp b/include/mbgl/text/glyph_store.hpp
deleted file mode 100644
index 95ab92f307..0000000000
--- a/include/mbgl/text/glyph_store.hpp
+++ /dev/null
@@ -1,99 +0,0 @@
-#ifndef MBGL_TEXT_GLYPH_STORE
-#define MBGL_TEXT_GLYPH_STORE
-
-#include <mbgl/text/glyph.hpp>
-#include <mbgl/util/pbf.hpp>
-#include <mbgl/util/vec.hpp>
-#include <mbgl/util/ptr.hpp>
-
-#include <cstdint>
-#include <vector>
-#include <future>
-#include <map>
-#include <set>
-#include <unordered_map>
-
-namespace mbgl {
-
-class FileSource;
-
-class SDFGlyph {
-public:
- uint32_t id = 0;
-
- // A signed distance field of the glyph with a border of 3 pixels.
- std::string bitmap;
-
- // Glyph metrics
- GlyphMetrics metrics;
-};
-
-class FontStack {
-public:
- void insert(uint32_t id, const SDFGlyph &glyph);
- const std::map<uint32_t, GlyphMetrics> &getMetrics() const;
- const std::map<uint32_t, SDFGlyph> &getSDFs() const;
- const Shaping getShaping(const std::u32string &string, float maxWidth, float lineHeight,
- float horizontalAlign, float verticalAlign, float justify,
- float spacing, const vec2<float> &translate) const;
- void lineWrap(Shaping &shaping, float lineHeight, float maxWidth, float horizontalAlign,
- float verticalAlign, float justify) const;
-
-private:
- std::map<uint32_t, std::string> bitmaps;
- std::map<uint32_t, GlyphMetrics> metrics;
- std::map<uint32_t, SDFGlyph> sdfs;
- mutable std::mutex mtx;
-};
-
-class GlyphPBF {
-public:
- GlyphPBF(const std::string &glyphURL, const std::string &fontStack, GlyphRange glyphRange, FileSource& fileSource);
-
-private:
- GlyphPBF(const GlyphPBF &) = delete;
- GlyphPBF(GlyphPBF &&) = delete;
- GlyphPBF &operator=(const GlyphPBF &) = delete;
- GlyphPBF &operator=(GlyphPBF &&) = delete;
-
-public:
- void parse(FontStack &stack);
-
- std::shared_future<GlyphPBF &> getFuture();
-
-private:
- std::string data;
- std::promise<GlyphPBF &> promise;
- std::shared_future<GlyphPBF &> future;
- std::mutex mtx;
-};
-
-// Manages Glyphrange PBF loading.
-class GlyphStore {
-public:
- GlyphStore(FileSource& fileSource);
-
- // Block until all specified GlyphRanges of the specified font stack are loaded.
- void waitForGlyphRanges(const std::string &fontStack, const std::set<GlyphRange> &glyphRanges);
-
- FontStack &getFontStack(const std::string &fontStack);
-
- void setURL(const std::string &url);
-
-private:
- // Loads an individual glyph range from the font stack and adds it to rangeSets
- std::shared_future<GlyphPBF &> loadGlyphRange(const std::string &fontStack, std::map<GlyphRange, std::unique_ptr<GlyphPBF>> &rangeSets, GlyphRange range);
-
- FontStack &createFontStack(const std::string &fontStack);
-
- std::string glyphURL;
- FileSource& fileSource;
- std::unordered_map<std::string, std::map<GlyphRange, std::unique_ptr<GlyphPBF>>> ranges;
- std::unordered_map<std::string, std::unique_ptr<FontStack>> stacks;
- std::mutex mtx;
-};
-
-
-}
-
-#endif
diff --git a/include/mbgl/text/placement.hpp b/include/mbgl/text/placement.hpp
deleted file mode 100644
index 28eb8d5317..0000000000
--- a/include/mbgl/text/placement.hpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef MBGL_TEXT_PLACEMENT
-#define MBGL_TEXT_PLACEMENT
-
-#include <mbgl/text/types.hpp>
-#include <mbgl/text/glyph.hpp>
-
-#include <mbgl/util/vec.hpp>
-
-namespace mbgl {
-
-struct Anchor;
-class StyleBucketSymbol;
-
-class Placement {
-public:
- static Placement getIcon(Anchor &anchor, const Rect<uint16_t> &image, float iconBoxScale,
- const std::vector<Coordinate> &line, const StyleBucketSymbol &props);
-
- static Placement getGlyphs(Anchor &anchor, const vec2<float> &origin, const Shaping &shaping,
- const GlyphPositions &face, float boxScale, bool horizontal,
- const std::vector<Coordinate> &line, const StyleBucketSymbol &props);
-
- static const float globalMinScale;
-
- GlyphBoxes boxes;
- PlacedGlyphs shapes;
- float minScale;
-};
-}
-
-#endif
diff --git a/include/mbgl/text/rotation_range.hpp b/include/mbgl/text/rotation_range.hpp
deleted file mode 100644
index 4968fda164..0000000000
--- a/include/mbgl/text/rotation_range.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef MBGL_TEXT_ROTATION_RANGE
-#define MBGL_TEXT_ROTATION_RANGE
-
-#include <mbgl/util/math.hpp>
-#include <mbgl/text/types.hpp>
-
-#include <vector>
-#include <cassert>
-
-namespace mbgl {
-
-/*
- * Combine an array of collision ranges to form a continuous
- * range that includes 0. Collisions within the ignoreRange are ignored
- */
-CollisionRange mergeCollisions(const CollisionList &collisions,
- PlacementRange ignoreRange);
-
-/*
- * Calculate collision ranges for two rotating boxes.e
- */
-CollisionList rotatingRotatingCollisions(const CollisionRect &a,
- const CollisionRect &b,
- const CollisionAnchor &anchorToAnchor);
-
-/*
- * Return the intersection points of a circle and a line segment;
- */
-void circleEdgeCollisions(std::back_insert_iterator<CollisionAngles> angles,
- const CollisionPoint &corner, float radius,
- const CollisionPoint &p1, const CollisionPoint &p2);
-
-/*
- * Calculate the ranges for which the corner,
- * rotatated around the anchor, is within the box;
- */
-void cornerBoxCollisions(std::back_insert_iterator<CollisionList> collisions,
- const CollisionPoint &corner,
- const CollisionCorners &boxCorners, bool flip = false);
-
-/*
- * Calculate collision ranges for a rotating box and a fixed box;
- */
-CollisionList rotatingFixedCollisions(const CollisionRect &rotating,
- const CollisionRect &fixed);
-
-/*
- * Calculate the range a box conflicts with a second box
- */
-CollisionRange rotationRange(const GlyphBox &inserting,
- const PlacementBox &blocker, float scale);
-}
-
-#endif
diff --git a/include/mbgl/text/types.hpp b/include/mbgl/text/types.hpp
deleted file mode 100644
index 23f49aa748..0000000000
--- a/include/mbgl/text/types.hpp
+++ /dev/null
@@ -1,113 +0,0 @@
-#ifndef MBGL_TEXT_TYPES
-#define MBGL_TEXT_TYPES
-
-#include <mbgl/util/vec.hpp>
-#include <mbgl/util/rect.hpp>
-#include <mbgl/util/optional.hpp>
-#include <array>
-#include <vector>
-
-namespace mbgl {
-
-typedef vec2<float> CollisionPoint;
-typedef vec2<float> CollisionAnchor;
-
-typedef std::array<float, 2> PlacementRange;
-typedef float CollisionAngle;
-typedef std::vector<CollisionAngle> CollisionAngles;
-typedef std::array<CollisionAngle, 2> CollisionRange;
-typedef std::vector<CollisionRange> CollisionList;
-typedef std::array<CollisionPoint, 4> CollisionCorners;
-
-struct CollisionRect {
- CollisionPoint tl;
- CollisionPoint br;
- inline explicit CollisionRect() {}
- inline explicit CollisionRect(CollisionPoint::Type ax,
- CollisionPoint::Type ay,
- CollisionPoint::Type bx,
- CollisionPoint::Type by)
- : tl(ax, ay), br(bx, by) {}
- inline explicit CollisionRect(const CollisionPoint &tl_,
- const CollisionPoint &br_)
- : tl(tl_), br(br_) {}
-};
-
-// These are the glyph boxes that we want to have placed.
-struct GlyphBox {
- explicit GlyphBox() {}
- explicit GlyphBox(const CollisionRect &box_,
- const CollisionAnchor &anchor_,
- float minScale_,
- float maxScale_,
- float padding_)
- : box(box_), anchor(anchor_), minScale(minScale_), maxScale(maxScale_), padding(padding_) {}
- explicit GlyphBox(const CollisionRect &box_,
- float minScale_,
- float padding_)
- : box(box_), minScale(minScale_), padding(padding_) {}
-
- CollisionRect box;
- CollisionAnchor anchor;
- float minScale = 0.0f;
- float maxScale = std::numeric_limits<float>::infinity();
- float padding = 0.0f;
- mapbox::util::optional<CollisionRect> hBox;
-};
-
-typedef std::vector<GlyphBox> GlyphBoxes;
-
-
-// TODO: Transform the vec2<float>s to vec2<int16_t> to save bytes
-struct PlacedGlyph {
- explicit PlacedGlyph(const vec2<float> &tl_, const vec2<float> &tr_,
- const vec2<float> &bl_, const vec2<float> &br_,
- const Rect<uint16_t> &tex_, float angle_, const vec2<float> &anchor_,
- float minScale_, float maxScale_)
- : tl(tl_),
- tr(tr_),
- bl(bl_),
- br(br_),
- tex(tex_),
- angle(angle_),
- anchor(anchor_),
- minScale(minScale_),
- maxScale(maxScale_) {}
-
- vec2<float> tl, tr, bl, br;
- Rect<uint16_t> tex;
- float angle;
- vec2<float> anchor;
- float minScale, maxScale;
-};
-
-typedef std::vector<PlacedGlyph> PlacedGlyphs;
-
-// These are the placed boxes contained in the rtree.
-struct PlacementBox {
- CollisionAnchor anchor;
- CollisionRect box;
- mapbox::util::optional<CollisionRect> hBox;
- PlacementRange placementRange = {{0.0f, 0.0f}};
- float placementScale = 0.0f;
- float maxScale = std::numeric_limits<float>::infinity();
- float padding = 0.0f;
-};
-
-struct PlacementProperty {
- explicit PlacementProperty() {}
- explicit PlacementProperty(float zoom_, const PlacementRange &rotationRange_)
- : zoom(zoom_), rotationRange(rotationRange_) {}
-
- inline operator bool() const {
- return !std::isnan(zoom) && zoom != std::numeric_limits<float>::infinity() &&
- rotationRange[0] != rotationRange[1];
- }
-
- float zoom = std::numeric_limits<float>::infinity();
- PlacementRange rotationRange = {{0.0f, 0.0f}};
-};
-
-}
-
-#endif
diff --git a/include/mbgl/util/clip_ids.hpp b/include/mbgl/util/clip_ids.hpp
deleted file mode 100644
index 5855b16af7..0000000000
--- a/include/mbgl/util/clip_ids.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef MBGL_UTIL_CLIP_IDS
-#define MBGL_UTIL_CLIP_IDS
-
-#include <mbgl/map/tile.hpp>
-#include <list>
-#include <set>
-#include <vector>
-#include <forward_list>
-#include <map>
-
-namespace mbgl {
-
-class ClipIDGenerator {
-private:
- struct Leaf {
- Leaf(Tile &tile);
- void add(const Tile::ID &p);
- bool operator==(const Leaf &other) const;
-
- Tile &tile;
- std::forward_list<Tile::ID> children;
- };
-
- typedef std::vector<Leaf> Pool;
- std::forward_list<Pool> pools;
- uint8_t bit_offset = 0;
-
-private:
- bool reuseExisting(Leaf &leaf);
-
-public:
- void update(std::forward_list<Tile *> tiles);
-};
-
-
-}
-
-#endif
diff --git a/include/mbgl/util/compression.hpp b/include/mbgl/util/compression.hpp
deleted file mode 100644
index a33b2476a7..0000000000
--- a/include/mbgl/util/compression.hpp
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef MBGL_UTIL_COMPRESSION
-#define MBGL_UTIL_COMPRESSION
-
-#include <string>
-
-namespace mbgl {
-namespace util {
-
-std::string compress(const std::string &raw);
-std::string decompress(const std::string &raw);
-
-}
-}
-
-#endif
diff --git a/include/mbgl/util/constants.hpp b/include/mbgl/util/constants.hpp
deleted file mode 100644
index 89e8af2ef1..0000000000
--- a/include/mbgl/util/constants.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef MBGL_UTIL_CONSTANTS
-#define MBGL_UTIL_CONSTANTS
-
-#include <cmath>
-
-#include "vec.hpp"
-
-namespace mbgl {
-
-namespace util {
-
-extern const float tileSize;
-
-}
-
-namespace debug {
-
-extern const bool tileParseWarnings;
-extern const bool styleParseWarnings;
-extern const bool spriteWarnings;
-extern const bool renderWarnings;
-extern const bool renderTree;
-extern const bool labelTextMissingWarning;
-extern const bool missingFontStackWarning;
-extern const bool missingFontFaceWarning;
-extern const bool glyphWarning;
-extern const bool shapingWarning;
-
-}
-
-}
-
-#endif
diff --git a/include/mbgl/util/error.hpp b/include/mbgl/util/error.hpp
deleted file mode 100644
index 09fa8d3e21..0000000000
--- a/include/mbgl/util/error.hpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef MBGL_UTIL_ERROR
-#define MBGL_UTIL_ERROR
-
-#include <stdexcept>
-#include <string>
-
-namespace mbgl {
-namespace error {
-
-struct style_parse : std::exception {
- inline style_parse(size_t offset_, const char *msg_) : offset(offset_), msg(msg_) {}
- inline const char* what() const noexcept { return msg.c_str(); }
- const size_t offset;
- const std::string msg;
-};
-}
-
-}
-
-#endif \ No newline at end of file
diff --git a/include/mbgl/util/interpolate.hpp b/include/mbgl/util/interpolate.hpp
deleted file mode 100644
index c9232db4eb..0000000000
--- a/include/mbgl/util/interpolate.hpp
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef MBGL_UTIL_INTERPOLATE
-#define MBGL_UTIL_INTERPOLATE
-
-#include <array>
-
-namespace mbgl {
-namespace util {
-
-template <typename T>
-T interpolate(const T a, const T b, const double t) {
- return a * (1.0 - t) + b * t;
-}
-
-template <typename T>
-inline std::array<T, 4> interpolate(const std::array<T, 4>& a, const std::array<T, 4>& b, const double t) {
- return {{
- interpolate(a[0], b[0], t),
- interpolate(a[1], b[1], t),
- interpolate(a[2], b[2], t),
- interpolate(a[3], b[3], t)
- }};
-}
-
-}
-}
-
-#endif
diff --git a/include/mbgl/util/io.hpp b/include/mbgl/util/io.hpp
deleted file mode 100644
index e95fc16d9d..0000000000
--- a/include/mbgl/util/io.hpp
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef MBGL_UTIL_IO
-#define MBGL_UTIL_IO
-
-#include <string>
-
-namespace mbgl {
-namespace util {
-
-void write_file(const std::string &filename, const std::string &data);
-std::string read_file(const std::string &filename);
-
-}
-}
-
-#endif
diff --git a/include/mbgl/util/mapbox.hpp b/include/mbgl/util/mapbox.hpp
deleted file mode 100644
index 0fbb9a91ed..0000000000
--- a/include/mbgl/util/mapbox.hpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef MBGL_UTIL_MAPBOX
-#define MBGL_UTIL_MAPBOX
-
-#include <string>
-
-namespace mbgl {
-namespace util {
-namespace mapbox {
-
-std::string normalizeSourceURL(const std::string& url, const std::string& accessToken);
-std::string normalizeGlyphsURL(const std::string& url, const std::string& accessToken);
-
-}
-}
-}
-
-#endif
diff --git a/include/mbgl/util/mat3.hpp b/include/mbgl/util/mat3.hpp
deleted file mode 100644
index fa40751764..0000000000
--- a/include/mbgl/util/mat3.hpp
+++ /dev/null
@@ -1,42 +0,0 @@
-// This is an incomplete port of http://glmatrix.net/
-//
-// Copyright (c) 2013 Brandon Jones, Colin MacKenzie IV
-//
-// This software is provided 'as-is', without any express or implied warranty.
-// In no event will the authors be held liable for any damages arising from the
-// use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not claim
-// that you wrote the original software. If you use this software in a
-// product, an acknowledgment in the product documentation would be
-// appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not be
-// misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source distribution.
-
-#ifndef MBGL_UTIL_MAT3
-#define MBGL_UTIL_MAT3
-
-#include <array>
-
-namespace mbgl {
-
-typedef std::array<float, 9> mat3;
-
-namespace matrix {
-
-void identity(mat3& out);
-void translate(mat3& out, const mat3& a, float x, float y);
-void rotate(mat3& out, const mat3& a, float rad);
-void scale(mat3& out, const mat3& a, float x, float y);
-
-}
-}
-
-#endif
diff --git a/include/mbgl/util/optional.hpp b/include/mbgl/util/optional.hpp
deleted file mode 100644
index 133e2c8f97..0000000000
--- a/include/mbgl/util/optional.hpp
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef MAPBOX_UTIL_OPTIONAL_HPP
-#define MAPBOX_UTIL_OPTIONAL_HPP
-
-#include <type_traits>
-
-#include "variant.hpp"
-
-namespace mapbox
-{
-namespace util
-{
-
-template <typename T> class optional
-{
- static_assert(!std::is_reference<T>::value, "optional doesn't support references");
-
- struct none_type
- {
- };
-
- variant<none_type, T> variant_;
-
- public:
- optional() = default;
-
- optional(optional const &rhs)
- {
- if (this != &rhs)
- { // protect against invalid self-assignment
- variant_ = rhs.variant_;
- }
- }
-
- optional(T const &v) { variant_ = v; }
-
- explicit operator bool() const noexcept { return variant_.template is<T>(); }
-
- T const &get() const { return variant_.template get<T>(); }
- T &get() { return variant_.template get<T>(); }
-
- T const &operator*() const { return this->get(); }
- T operator*() { return this->get(); }
-
- optional &operator=(T const &v)
- {
- variant_ = v;
- return *this;
- }
-
- optional &operator=(optional const &rhs)
- {
- if (this != &rhs)
- {
- variant_ = rhs.variant_;
- }
- return *this;
- }
-
- template <typename... Args> void emplace(Args &&... args)
- {
- variant_ = T{std::forward<Args>(args)...};
- }
-
- void reset() { variant_ = none_type{}; }
-};
-}
-}
-
-#endif
diff --git a/include/mbgl/util/pbf.hpp b/include/mbgl/util/pbf.hpp
deleted file mode 100644
index d017219a52..0000000000
--- a/include/mbgl/util/pbf.hpp
+++ /dev/null
@@ -1,184 +0,0 @@
-#ifndef MBGL_UTIL_PBF
-#define MBGL_UTIL_PBF
-
-/*
- * Some parts are from upb - a minimalist implementation of protocol buffers.
- *
- * Copyright (c) 2008-2011 Google Inc. See LICENSE for details.
- * Author: Josh Haberman <jhaberman@gmail.com>
- */
-
-#include <string>
-#include <cstring>
-
-namespace mbgl {
-
-struct pbf {
- struct exception : std::exception { const char *what() const noexcept { return "pbf exception"; } };
- struct unterminated_varint_exception : exception { const char *what() const noexcept { return "pbf unterminated varint exception"; } };
- struct varint_too_long_exception : exception { const char *what() const noexcept { return "pbf varint too long exception"; } };
- struct unknown_field_type_exception : exception { const char *what() const noexcept { return "pbf unknown field type exception"; } };
- struct end_of_buffer_exception : exception { const char *what() const noexcept { return "pbf end of buffer exception"; } };
-
- inline pbf(const unsigned char *data, size_t length);
- inline pbf();
-
- inline operator bool() const;
-
- inline bool next();
- inline bool next(uint32_t tag);
- template <typename T = uint32_t> inline T varint();
- template <typename T = uint32_t> inline T svarint();
-
- template <typename T = uint32_t, int bytes = 4> inline T fixed();
- inline float float32();
- inline double float64();
-
- inline std::string string();
- inline bool boolean();
-
- inline pbf message();
-
- inline void skip();
- inline void skipValue(uint32_t val);
- inline void skipBytes(uint32_t bytes);
-
- const uint8_t *data = nullptr;
- const uint8_t *end = nullptr;
- uint32_t value = 0;
- uint32_t tag = 0;
-};
-
-pbf::pbf(const unsigned char *data_, size_t length)
- : data(data_),
- end(data_ + length),
- value(0),
- tag(0) {
-}
-
-pbf::pbf()
- : data(nullptr),
- end(nullptr),
- value(0),
- tag(0) {
-}
-
-
-pbf::operator bool() const {
- return data < end;
-}
-
-bool pbf::next() {
- if (data < end) {
- value = static_cast<uint32_t>(varint());
- tag = value >> 3;
- return true;
- }
- return false;
-}
-
-bool pbf::next(uint32_t requested_tag) {
- while (next()) {
- if (tag == requested_tag) {
- return true;
- } else {
- skip();
- }
- }
- return false;
-}
-
-template <typename T>
-T pbf::varint() {
- uint8_t byte = 0x80;
- T result = 0;
- int bitpos;
- for (bitpos = 0; bitpos < 70 && (byte & 0x80); bitpos += 7) {
- if (data >= end) {
- throw unterminated_varint_exception();
- }
- result |= ((T)(byte = *data) & 0x7F) << bitpos;
-
- data++;
- }
- if (bitpos == 70 && (byte & 0x80)) {
- throw varint_too_long_exception();
- }
-
- return result;
-}
-
-template <typename T>
-T pbf::svarint() {
- T n = varint<T>();
- return (n >> 1) ^ -(T)(n & 1);
-}
-
-template <typename T, int bytes>
-T pbf::fixed() {
- skipBytes(bytes);
- T result;
- memcpy(&result, data - bytes, bytes);
- return result;
-}
-
-float pbf::float32() {
- return fixed<float, 4>();
-}
-
-double pbf::float64() {
- return fixed<double, 8>();
-}
-
-std::string pbf::string() {
- uint32_t bytes = static_cast<uint32_t>(varint());
- const char *string_data = reinterpret_cast<const char*>(data);
- skipBytes(bytes);
- return std::string(string_data, bytes);
-}
-
-bool pbf::boolean() {
- skipBytes(1);
- return *(bool *)(data - 1);
-}
-
-pbf pbf::message() {
- uint32_t bytes = static_cast<uint32_t>(varint());
- const uint8_t *pos = data;
- skipBytes(bytes);
- return pbf(pos, bytes);
-}
-
-void pbf::skip() {
- skipValue(value);
-}
-
-void pbf::skipValue(uint32_t val) {
- switch (val & 0x7) {
- case 0: // varint
- varint();
- break;
- case 1: // 64 bit
- skipBytes(8);
- break;
- case 2: // string/message
- skipBytes(static_cast<uint32_t>(varint()));
- break;
- case 5: // 32 bit
- skipBytes(4);
- break;
- default:
- throw unknown_field_type_exception();
- }
-}
-
-void pbf::skipBytes(uint32_t bytes) {
- if (data + bytes > end) {
- throw end_of_buffer_exception();
- }
- data += bytes;
-}
-
-} // end namespace mbgl
-
-#endif
diff --git a/include/mbgl/util/queue.h b/include/mbgl/util/queue.h
deleted file mode 100644
index fe02b454ea..0000000000
--- a/include/mbgl/util/queue.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Copyright (c) 2013, Ben Noordhuis <info@bnoordhuis.nl>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef QUEUE_H_
-#define QUEUE_H_
-
-typedef void *QUEUE[2];
-
-/* Private macros. */
-#define QUEUE_NEXT(q) (*(QUEUE **) &((*(q))[0]))
-#define QUEUE_PREV(q) (*(QUEUE **) &((*(q))[1]))
-#define QUEUE_PREV_NEXT(q) (QUEUE_NEXT(QUEUE_PREV(q)))
-#define QUEUE_NEXT_PREV(q) (QUEUE_PREV(QUEUE_NEXT(q)))
-
-/* Public macros. */
-#define QUEUE_DATA(ptr, type, field) \
- ((type *) ((char *) (ptr) - ((char *) &((type *) 0)->field)))
-
-#define QUEUE_FOREACH(q, h) \
- for ((q) = QUEUE_NEXT(h); (q) != (h); (q) = QUEUE_NEXT(q))
-
-#define QUEUE_EMPTY(q) \
- ((const QUEUE *) (q) == (const QUEUE *) QUEUE_NEXT(q))
-
-#define QUEUE_HEAD(q) \
- (QUEUE_NEXT(q))
-
-#define QUEUE_INIT(q) \
- do { \
- QUEUE_NEXT(q) = (q); \
- QUEUE_PREV(q) = (q); \
- } \
- while (0)
-
-#define QUEUE_ADD(h, n) \
- do { \
- QUEUE_PREV_NEXT(h) = QUEUE_NEXT(n); \
- QUEUE_NEXT_PREV(n) = QUEUE_PREV(h); \
- QUEUE_PREV(h) = QUEUE_PREV(n); \
- QUEUE_PREV_NEXT(h) = (h); \
- } \
- while (0)
-
-#define QUEUE_SPLIT(h, q, n) \
- do { \
- QUEUE_PREV(n) = QUEUE_PREV(h); \
- QUEUE_PREV_NEXT(n) = (n); \
- QUEUE_NEXT(n) = (q); \
- QUEUE_PREV(h) = QUEUE_PREV(q); \
- QUEUE_PREV_NEXT(h) = (h); \
- QUEUE_PREV(q) = (n); \
- } \
- while (0)
-
-#define QUEUE_INSERT_HEAD(h, q) \
- do { \
- QUEUE_NEXT(q) = QUEUE_NEXT(h); \
- QUEUE_PREV(q) = (h); \
- QUEUE_NEXT_PREV(q) = (q); \
- QUEUE_NEXT(h) = (q); \
- } \
- while (0)
-
-#define QUEUE_INSERT_TAIL(h, q) \
- do { \
- QUEUE_NEXT(q) = (h); \
- QUEUE_PREV(q) = QUEUE_PREV(h); \
- QUEUE_PREV_NEXT(q) = (q); \
- QUEUE_PREV(h) = (q); \
- } \
- while (0)
-
-#define QUEUE_REMOVE(q) \
- do { \
- QUEUE_PREV_NEXT(q) = QUEUE_NEXT(q); \
- QUEUE_NEXT_PREV(q) = QUEUE_PREV(q); \
- } \
- while (0)
-
-#endif /* QUEUE_H_ */
diff --git a/include/mbgl/util/raster.hpp b/include/mbgl/util/raster.hpp
deleted file mode 100644
index ff27f509f4..0000000000
--- a/include/mbgl/util/raster.hpp
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef MBGL_UTIL_RASTER
-#define MBGL_UTIL_RASTER
-
-#include <mbgl/util/transition.hpp>
-#include <mbgl/util/texture_pool.hpp>
-#include <mbgl/util/image.hpp>
-#include <mbgl/util/ptr.hpp>
-#include <mbgl/renderer/prerendered_texture.hpp>
-
-#include <string>
-#include <mutex>
-
-typedef struct uv_loop_s uv_loop_t;
-
-namespace mbgl {
-
-class Raster : public std::enable_shared_from_this<Raster> {
-
-public:
- Raster(TexturePool&);
- ~Raster();
-
- // load image data
- bool load(const std::string &img);
-
- // bind current texture
- void bind(bool linear = false);
-
- // bind prerendered texture
- void bind(const GLuint texture);
-
- // loaded status
- bool isLoaded() const;
-
- // transitions
- void beginFadeInTransition();
- bool needsTransition() const;
- void updateTransitions(timestamp now);
-
-public:
- // loaded image dimensions
- uint32_t width = 0, height = 0;
-
- // has been uploaded to texture
- bool textured = false;
-
- // the uploaded texture
- uint32_t texture = 0;
-
- // texture opacity
- double opacity = 0;
-
-private:
- mutable std::mutex mtx;
-
- // raw pixels have been loaded
- bool loaded = false;
-
- // shared texture pool
- TexturePool& texturePool;
-
- // min/mag filter
- uint32_t filter = 0;
-
- // the raw pixels
- std::unique_ptr<util::Image> img;
-
- // fade in transition
- util::ptr<util::transition> fade_transition = nullptr;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/util/rect.hpp b/include/mbgl/util/rect.hpp
deleted file mode 100644
index f5c77f93d1..0000000000
--- a/include/mbgl/util/rect.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef MBGL_UTIL_RECT
-#define MBGL_UTIL_RECT
-
-namespace mbgl {
-
-template <typename T>
-struct Rect {
- inline Rect() {}
- inline Rect(T x_, T y_, T w_, T h_) : x(x_), y(y_), w(w_), h(h_) {}
- T x = 0, y = 0;
- T w = 0, h = 0;
-
- template <typename Number>
- Rect operator *(Number value) const {
- return Rect(x * value, y * value, w * value, h * value);
- }
-
- operator bool() const { return w != 0 && h != 0; }
-};
-}
-
-#endif
diff --git a/include/mbgl/util/sqlite3.hpp b/include/mbgl/util/sqlite3.hpp
deleted file mode 100644
index 3e324f7ce1..0000000000
--- a/include/mbgl/util/sqlite3.hpp
+++ /dev/null
@@ -1,74 +0,0 @@
-#pragma once
-
-#include <string>
-#include <stdexcept>
-
-typedef struct sqlite3 sqlite3;
-typedef struct sqlite3_stmt sqlite3_stmt;
-
-namespace mapbox {
-namespace sqlite {
-
-enum OpenFlag : int {
- ReadOnly = 0x00000001,
- ReadWrite = 0x00000002,
- Create = 0x00000004,
- NoMutex = 0x00008000,
- FullMutex = 0x00010000,
- SharedCache = 0x00020000,
- PrivateCache = 0x00040000,
-};
-
-struct Exception : std::runtime_error {
- inline Exception(int err, const char *msg) : std::runtime_error(msg), code(err) {}
- const int code = 0;
-};
-
-class Statement;
-
-class Database {
-private:
- Database(const Database &) = delete;
- Database &operator=(const Database &) = delete;
-
-public:
- Database(const std::string &filename, int flags = 0);
- Database(Database &&);
- ~Database();
- Database &operator=(Database &&);
-
- operator bool() const;
-
- void exec(const std::string &sql);
- Statement prepare(const char *query);
-
-private:
- sqlite3 *db = nullptr;
-};
-
-class Statement {
-private:
- Statement(const Statement &) = delete;
- Statement &operator=(const Statement &) = delete;
-
-public:
- Statement(sqlite3 *db, const char *sql);
- Statement(Statement &&);
- ~Statement();
- Statement &operator=(Statement &&);
-
- operator bool() const;
-
- template <typename T> void bind(int offset, T value);
- void bind(int offset, const std::string &value, bool retain = true);
- template <typename T> T get(int offset);
-
- bool run();
- void reset();
-
-private:
- sqlite3_stmt *stmt = nullptr;
-};
-
-}
-}
diff --git a/include/mbgl/util/stopwatch.hpp b/include/mbgl/util/stopwatch.hpp
deleted file mode 100644
index 663bbb6fc7..0000000000
--- a/include/mbgl/util/stopwatch.hpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef MBGL_UTIL_STOPWATCH
-#define MBGL_UTIL_STOPWATCH
-
-#include <mbgl/platform/event.hpp>
-
-#include <string>
-
-namespace mbgl {
-namespace util {
-
-#ifndef DISABLE_STOPWATCH
-class stopwatch {
-public:
- stopwatch(Event event = Event::General);
- stopwatch(EventSeverity severity, Event event = Event::General);
- stopwatch(const std::string &name, Event event = Event::General);
- stopwatch(const std::string &name, EventSeverity severity, Event event = Event::General);
- void report(const std::string &name);
- ~stopwatch();
-
-private:
- const std::string name;
- EventSeverity severity = EventSeverity::Debug;
- Event event = Event::General;
- uint64_t start;
-};
-#else
-class stopwatch {
- inline stopwatch(Event event = Event::General);
- inline stopwatch(EventSeverity severity, Event event = Event::General);
- inline stopwatch(const std::string &name, Event event = Event::General);
- inline stopwatch(const std::string &name, EventSeverity severity, Event event = Event::General);
- inline void report(const std::string &name) {}
- inline ~stopwatch() {}
-};
-#endif
-}
-}
-
-#endif
diff --git a/include/mbgl/util/texture_pool.hpp b/include/mbgl/util/texture_pool.hpp
deleted file mode 100644
index 95d918c237..0000000000
--- a/include/mbgl/util/texture_pool.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef MBGL_UTIL_TEXTUREPOOL
-#define MBGL_UTIL_TEXTUREPOOL
-
-#include <mbgl/util/noncopyable.hpp>
-#include <mbgl/platform/gl.hpp>
-
-#include <set>
-#include <mutex>
-
-namespace mbgl {
-
-class TexturePool : private util::noncopyable {
-
-public:
- GLuint getTextureID();
- void removeTextureID(GLuint texture_id);
- void clearTextureIDs();
-
-private:
- std::set<GLuint> texture_ids;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/util/token.hpp b/include/mbgl/util/token.hpp
deleted file mode 100644
index 64192a99f9..0000000000
--- a/include/mbgl/util/token.hpp
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef MBGL_UTIL_TOKEN
-#define MBGL_UTIL_TOKEN
-
-#include <map>
-#include <string>
-#include <algorithm>
-
-namespace mbgl {
-namespace util {
-
-// Replaces {tokens} in a string by calling the lookup function.
-template <typename Lookup>
-std::string replaceTokens(const std::string &source, const Lookup &lookup) {
- std::string result;
- result.reserve(source.size());
-
- auto pos = source.begin();
- const auto end = source.end();
-
- while (pos != end) {
- auto brace = std::find(pos, end, '{');
- result.append(pos, brace);
- pos = brace;
- if (pos != end) {
- for (brace++; brace != end && (std::isalnum(*brace) || *brace == '_'); brace++);
- if (brace != end && *brace == '}') {
- result.append(lookup({ pos + 1, brace }));
- pos = brace + 1;
- } else {
- result.append(pos, brace);
- pos = brace;
- }
- }
- }
-
- return result;
-}
-
-template <typename T>
-inline std::string replaceTokens(const std::string &source, const std::map<std::string, T> &properties) {
- return replaceTokens(source, [&properties](const std::string &token) -> std::string {
- const auto it_prop = properties.find(token);
- return it_prop != properties.end() ? toString(it_prop->second) : "";
- });
-}
-
-} // end namespace util
-} // end namespace mbgl
-
-#endif
diff --git a/include/mbgl/util/transition.hpp b/include/mbgl/util/transition.hpp
deleted file mode 100644
index b78abfa8fd..0000000000
--- a/include/mbgl/util/transition.hpp
+++ /dev/null
@@ -1,78 +0,0 @@
-#ifndef MBGL_UTIL_TRANSITION
-#define MBGL_UTIL_TRANSITION
-
-#include <mbgl/util/noncopyable.hpp>
-#include <mbgl/util/time.hpp>
-#include <mbgl/style/types.hpp>
-
-namespace mbgl {
-namespace util {
-
-class transition : private noncopyable {
-public:
- enum state {
- running,
- complete
- };
-
- inline transition(timestamp start_, timestamp duration_)
- : start(start_),
- duration(duration_) {}
-
- inline float progress(timestamp now) const {
- if (duration == 0) return 1;
- if (start > now) return 0;
-
- return (float)(now - start) / duration;
- }
-
- virtual state update(timestamp now) const = 0;
- virtual ~transition();
-
-protected:
- const timestamp start, duration;
-};
-
-template <typename T>
-class ease_transition : public transition {
-public:
- ease_transition(T from_, T to_, T& value_, timestamp start_, timestamp duration_)
- : transition(start_, duration_),
- from(from_),
- to(to_),
- value(value_) {}
-
- state update(timestamp now) const;
-
-private:
- const T from, to;
- T& value;
-
-};
-
-template <typename T>
-class timeout : public transition {
-public:
- timeout(T final_value_, T& value_, timestamp start_, timestamp duration_)
- : transition(start_, duration_),
- final_value(final_value_),
- value(value_) {}
-
- state update(timestamp now) const {
- if (progress(now) >= 1) {
- value = final_value;
- return complete;
- } else {
- return running;
- }
- }
-
-private:
- const T final_value;
- T& value;
-};
-
-}
-}
-
-#endif
diff --git a/include/mbgl/util/unitbezier.hpp b/include/mbgl/util/unitbezier.hpp
deleted file mode 100644
index 095e15f809..0000000000
--- a/include/mbgl/util/unitbezier.hpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2008 Apple 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.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. OR
- * CONTRIBUTORS 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.
- */
-
-#ifndef MBGL_UTIL_UNITBEZIER
-#define MBGL_UTIL_UNITBEZIER
-
-#include <cmath>
-
-namespace mbgl {
-namespace util {
-
-struct UnitBezier {
- UnitBezier(double p1x, double p1y, double p2x, double p2y) {
- // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).
- cx = 3.0 * p1x;
- bx = 3.0 * (p2x - p1x) - cx;
- ax = 1.0 - cx - bx;
-
- cy = 3.0 * p1y;
- by = 3.0 * (p2y - p1y) - cy;
- ay = 1.0 - cy - by;
- }
-
- double sampleCurveX(double t) {
- // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.
- return ((ax * t + bx) * t + cx) * t;
- }
-
- double sampleCurveY(double t) {
- return ((ay * t + by) * t + cy) * t;
- }
-
- double sampleCurveDerivativeX(double t) {
- return (3.0 * ax * t + 2.0 * bx) * t + cx;
- }
-
- // Given an x value, find a parametric value it came from.
- double solveCurveX(double x, double epsilon) {
- double t0;
- double t1;
- double t2;
- double x2;
- double d2;
- int i;
-
- // First try a few iterations of Newton's method -- normally very fast.
- for (t2 = x, i = 0; i < 8; ++i) {
- x2 = sampleCurveX(t2) - x;
- if (fabs (x2) < epsilon)
- return t2;
- d2 = sampleCurveDerivativeX(t2);
- if (fabs(d2) < 1e-6)
- break;
- t2 = t2 - x2 / d2;
- }
-
- // Fall back to the bisection method for reliability.
- t0 = 0.0;
- t1 = 1.0;
- t2 = x;
-
- if (t2 < t0)
- return t0;
- if (t2 > t1)
- return t1;
-
- while (t0 < t1) {
- x2 = sampleCurveX(t2);
- if (fabs(x2 - x) < epsilon)
- return t2;
- if (x > x2)
- t0 = t2;
- else
- t1 = t2;
- t2 = (t1 - t0) * .5 + t0;
- }
-
- // Failure.
- return t2;
- }
-
- double solve(double x, double epsilon) {
- return sampleCurveY(solveCurveX(x, epsilon));
- }
-
-private:
- double ax;
- double bx;
- double cx;
-
- double ay;
- double by;
- double cy;
-};
-
-}
-}
-
-#endif
diff --git a/include/mbgl/util/url.hpp b/include/mbgl/util/url.hpp
deleted file mode 100644
index a7e5291ec5..0000000000
--- a/include/mbgl/util/url.hpp
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef MBGL_UTIL_URL
-#define MBGL_UTIL_URL
-
-#include <string>
-
-namespace mbgl {
-namespace util {
-
-std::string percentEncode(const std::string&);
-std::string percentDecode(const std::string&);
-
-}
-}
-
-#endif
diff --git a/include/mbgl/util/uv-channel.h b/include/mbgl/util/uv-channel.h
deleted file mode 100644
index ea5c279f65..0000000000
--- a/include/mbgl/util/uv-channel.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef MBGL_UTIL_UV_CHANNEL
-#define MBGL_UTIL_UV_CHANNEL
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <uv.h>
-
-// Taken from http://navaneeth.github.io/blog/2013/08/02/channels-in-libuv/
-
-typedef struct uv_chan_s uv_chan_t;
-
-struct uv_chan_s {
- uv_mutex_t mutex;
- uv_cond_t cond;
- void *q[2];
-};
-
-int uv_chan_init(uv_chan_t *chan);
-void uv_chan_send(uv_chan_t *chan, void *data);
-void *uv_chan_receive(uv_chan_t *chan);
-void uv_chan_destroy(uv_chan_t *chan);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/include/mbgl/util/uv-worker.h b/include/mbgl/util/uv-worker.h
deleted file mode 100644
index cb2075d1c3..0000000000
--- a/include/mbgl/util/uv-worker.h
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef MBGL_UTIL_UV_WORKER
-#define MBGL_UTIL_UV_WORKER
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <mbgl/util/uv-messenger.h>
-#include <mbgl/util/uv-channel.h>
-
-#include <stdlib.h>
-
-typedef struct uv_worker_s uv_worker_t;
-
-typedef void (*uv_worker_cb)(void *data);
-typedef void (*uv_worker_after_cb)(void *data);
-typedef void (*uv_worker_close_cb)(uv_worker_t *worker);
-
-struct uv_worker_s {
-#ifndef NDEBUG
- unsigned long thread_id;
-#endif
- uv_loop_t *loop;
- uv_messenger_t *msgr;
- uv_chan_t chan;
- const char *name;
- int count;
- uv_worker_close_cb close_cb;
- unsigned int active_items;
-};
-
-int uv_worker_init(uv_worker_t *worker, uv_loop_t *loop, int count, const char *name);
-void uv_worker_send(uv_worker_t *worker, void *data, uv_worker_cb work_cb,
- uv_worker_after_cb after_work_cb);
-void uv_worker_close(uv_worker_t *worker, uv_worker_close_cb close_cb);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/include/mbgl/util/uv_detail.hpp b/include/mbgl/util/uv_detail.hpp
deleted file mode 100644
index 99f5edc145..0000000000
--- a/include/mbgl/util/uv_detail.hpp
+++ /dev/null
@@ -1,177 +0,0 @@
-#ifndef MBGL_UTIL_UV_DETAIL
-#define MBGL_UTIL_UV_DETAIL
-
-#include <mbgl/util/uv-worker.h>
-#include <mbgl/util/noncopyable.hpp>
-
-#include <uv.h>
-
-#include <functional>
-#include <cassert>
-#include <memory>
-#include <string>
-
-namespace uv {
-
-template <class T>
-void close(std::unique_ptr<T> ptr) {
- uv_close(reinterpret_cast<uv_handle_t*>(ptr.release()), [](uv_handle_t* handle) {
- delete reinterpret_cast<T*>(handle);
- });
-}
-
-class loop : public mbgl::util::noncopyable {
-public:
- inline loop() {
-#if UV_VERSION_MAJOR == 0 && UV_VERSION_MINOR <= 10
- l = uv_loop_new();
- if (l == nullptr) {
-#else
- l = new uv_loop_t;
- if (uv_loop_init(l) != 0) {
-#endif
- throw std::runtime_error("failed to initialize loop");
- }
- }
-
- inline ~loop() {
-#if UV_VERSION_MAJOR == 0 && UV_VERSION_MINOR <= 10
- uv_loop_delete(l);
-#else
- uv_loop_close(l);
- delete l;
-#endif
-
- }
-
- inline uv_loop_t *operator*() { return l; }
-
-private:
- uv_loop_t *l = nullptr;
-};
-
-class async : public mbgl::util::noncopyable {
-public:
- inline async(uv_loop_t* loop, std::function<void ()> fn_)
- : a(new uv_async_t)
- , fn(fn_)
- {
- a->data = this;
- if (uv_async_init(loop, a.get(), async_cb) != 0) {
- throw std::runtime_error("failed to initialize async");
- }
- }
-
- inline ~async() {
- close(std::move(a));
- }
-
- inline void send() {
- if (uv_async_send(a.get()) != 0) {
- throw std::runtime_error("failed to async send");
- }
- }
-
-private:
-#if UV_VERSION_MAJOR == 0 && UV_VERSION_MINOR <= 10
- static void async_cb(uv_async_t* a, int) {
-#else
- static void async_cb(uv_async_t* a) {
-#endif
- reinterpret_cast<async*>(a->data)->fn();
- }
-
- std::unique_ptr<uv_async_t> a;
- std::function<void ()> fn;
-};
-
-class rwlock : public mbgl::util::noncopyable {
-public:
- inline rwlock() {
- if (uv_rwlock_init(&mtx) != 0) {
- throw std::runtime_error("failed to initialize read-write lock");
- }
- }
- inline ~rwlock() { uv_rwlock_destroy(&mtx); }
- inline void rdlock() { uv_rwlock_rdlock(&mtx); }
- inline void wrlock() { uv_rwlock_wrlock(&mtx); }
- inline void rdunlock() { uv_rwlock_rdunlock(&mtx); }
- inline void wrunlock() { uv_rwlock_wrunlock(&mtx); }
-
-private:
- uv_rwlock_t mtx;
-};
-
-class readlock : public mbgl::util::noncopyable {
-public:
- inline readlock(rwlock &mtx_) : mtx(mtx_) { mtx.rdlock(); }
- inline readlock(const std::unique_ptr<rwlock> &mtx_) : mtx(*mtx_) { mtx.rdlock(); }
- inline ~readlock() { mtx.rdunlock(); }
-
-private:
- rwlock &mtx;
-};
-
-class writelock : public mbgl::util::noncopyable {
-public:
- inline writelock(rwlock &mtx_) : mtx(mtx_) { mtx.wrlock(); }
- inline writelock(const std::unique_ptr<rwlock> &mtx_) : mtx(*mtx_) { mtx.wrlock(); }
- inline ~writelock() { mtx.wrunlock(); }
-
-private:
- rwlock &mtx;
-};
-
-class worker : public mbgl::util::noncopyable {
-public:
- inline worker(uv_loop_t *loop, unsigned int count, const char *name = nullptr) : w(new uv_worker_t) {
- uv_worker_init(w, loop, count, name);
- }
- inline ~worker() {
- uv_worker_close(w, [](uv_worker_t *worker_) {
- delete worker_;
- });
- }
- inline void add(void *data, uv_worker_cb work_cb, uv_worker_after_cb after_work_cb) {
- uv_worker_send(w, data, work_cb, after_work_cb);
- }
-
-private:
- uv_worker_t *w;
-};
-
-template <typename T>
-class work : public mbgl::util::noncopyable {
-public:
- typedef std::function<void (T&)> work_callback;
- typedef std::function<void (T&)> after_work_callback;
-
- template<typename... Args>
- work(worker &worker, work_callback work_cb_, after_work_callback after_work_cb_, Args&&... args)
- : data(std::forward<Args>(args)...),
- work_cb(work_cb_),
- after_work_cb(after_work_cb_) {
- worker.add(this, do_work, after_work);
- }
-
-private:
- static void do_work(void *data) {
- work<T> *w = reinterpret_cast<work<T> *>(data);
- w->work_cb(w->data);
- }
-
- static void after_work(void *data) {
- work<T> *w = reinterpret_cast<work<T> *>(data);
- w->after_work_cb(w->data);
- delete w;
- }
-
-private:
- T data;
- work_callback work_cb;
- after_work_callback after_work_cb;
-};
-
-}
-
-#endif
diff --git a/include/mbgl/util/vec.hpp b/include/mbgl/util/vec.hpp
index 0179254fda..32de852758 100644
--- a/include/mbgl/util/vec.hpp
+++ b/include/mbgl/util/vec.hpp
@@ -105,11 +105,6 @@ struct vec4 {
};
-struct box {
- vec2<double> tl, tr, bl, br;
- vec2<double> center;
-};
-
typedef vec2<int16_t> Coordinate;
}
diff --git a/include/rapidjson/document.h b/include/rapidjson/document.h
deleted file mode 100755
index 83d95a33d0..0000000000
--- a/include/rapidjson/document.h
+++ /dev/null
@@ -1,821 +0,0 @@
-#ifndef RAPIDJSON_DOCUMENT_H_
-#define RAPIDJSON_DOCUMENT_H_
-
-#include "reader.h"
-#include "internal/strfunc.h"
-#include <new> // placement new
-
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable : 4127) // conditional expression is constant
-#endif
-
-namespace rapidjson {
-
-///////////////////////////////////////////////////////////////////////////////
-// GenericValue
-
-//! Represents a JSON value. Use Value for UTF8 encoding and default allocator.
-/*!
- A JSON value can be one of 7 types. This class is a variant type supporting
- these types.
-
- Use the Value if UTF8 and default allocator
-
- \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document)
- \tparam Allocator Allocator type for allocating memory of object, array and string.
-*/
-#pragma pack (push, 4)
-template <typename Encoding, typename Allocator = MemoryPoolAllocator<> >
-class GenericValue {
-public:
- //! Name-value pair in an object.
- struct Member {
- GenericValue<Encoding, Allocator> name; //!< name of member (must be a string)
- GenericValue<Encoding, Allocator> value; //!< value of member.
- };
-
- typedef Encoding EncodingType; //!< Encoding type from template parameter.
- typedef Allocator AllocatorType; //!< Allocator type from template parameter.
- typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding.
- typedef Member* MemberIterator; //!< Member iterator for iterating in object.
- typedef const Member* ConstMemberIterator; //!< Constant member iterator for iterating in object.
- typedef GenericValue* ValueIterator; //!< Value iterator for iterating in array.
- typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array.
-
- //!@name Constructors and destructor.
- //@{
-
- //! Default constructor creates a null value.
- GenericValue() : flags_(kNullFlag) {}
-
- //! Copy constructor is not permitted.
-private:
- GenericValue(const GenericValue& rhs);
-
-public:
-
- //! Constructor with JSON value type.
- /*! This creates a Value of specified type with default content.
- \param type Type of the value.
- \note Default content for number is zero.
- */
- GenericValue(Type type) {
- static const unsigned defaultFlags[7] = {
- kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kConstStringFlag,
- kNumberFlag | kIntFlag | kUintFlag | kInt64Flag | kUint64Flag | kDoubleFlag
- };
- RAPIDJSON_ASSERT(type <= kNumberType);
- flags_ = defaultFlags[type];
- memset(&data_, 0, sizeof(data_));
- }
-
- //! Constructor for boolean value.
- GenericValue(bool b) : flags_(b ? kTrueFlag : kFalseFlag) {}
-
- //! Constructor for int value.
- GenericValue(int i) : flags_(kNumberIntFlag) {
- data_.n.i64 = i;
- if (i >= 0)
- flags_ |= kUintFlag | kUint64Flag;
- }
-
- //! Constructor for unsigned value.
- GenericValue(unsigned u) : flags_(kNumberUintFlag) {
- data_.n.u64 = u;
- if (!(u & 0x80000000))
- flags_ |= kIntFlag | kInt64Flag;
- }
-
- //! Constructor for int64_t value.
- GenericValue(int64_t i64) : flags_(kNumberInt64Flag) {
- data_.n.i64 = i64;
- if (i64 >= 0) {
- flags_ |= kNumberUint64Flag;
- if (!(i64 & 0xFFFFFFFF00000000LL))
- flags_ |= kUintFlag;
- if (!(i64 & 0xFFFFFFFF80000000LL))
- flags_ |= kIntFlag;
- }
- else if (i64 >= -2147483648LL)
- flags_ |= kIntFlag;
- }
-
- //! Constructor for uint64_t value.
- GenericValue(uint64_t u64) : flags_(kNumberUint64Flag) {
- data_.n.u64 = u64;
- if (!(u64 & 0x8000000000000000ULL))
- flags_ |= kInt64Flag;
- if (!(u64 & 0xFFFFFFFF00000000ULL))
- flags_ |= kUintFlag;
- if (!(u64 & 0xFFFFFFFF80000000ULL))
- flags_ |= kIntFlag;
- }
-
- //! Constructor for double value.
- GenericValue(double d) : flags_(kNumberDoubleFlag) { data_.n.d = d; }
-
- //! Constructor for constant string (i.e. do not make a copy of string)
- GenericValue(const Ch* s, SizeType length) {
- RAPIDJSON_ASSERT(s != NULL);
- flags_ = kConstStringFlag;
- data_.s.str = s;
- data_.s.length = length;
- }
-
- //! Constructor for constant string (i.e. do not make a copy of string)
- GenericValue(const Ch* s) { SetStringRaw(s, internal::StrLen(s)); }
-
- //! Constructor for copy-string (i.e. do make a copy of string)
- GenericValue(const Ch* s, SizeType length, Allocator& allocator) { SetStringRaw(s, length, allocator); }
-
- //! Constructor for copy-string (i.e. do make a copy of string)
- GenericValue(const Ch*s, Allocator& allocator) { SetStringRaw(s, internal::StrLen(s), allocator); }
-
- //! Destructor.
- /*! Need to destruct elements of array, members of object, or copy-string.
- */
- ~GenericValue() {
- if (Allocator::kNeedFree) { // Shortcut by Allocator's trait
- switch(flags_) {
- case kArrayFlag:
- for (GenericValue* v = data_.a.elements; v != data_.a.elements + data_.a.size; ++v)
- v->~GenericValue();
- Allocator::Free(data_.a.elements);
- break;
-
- case kObjectFlag:
- for (Member* m = data_.o.members; m != data_.o.members + data_.o.size; ++m) {
- m->name.~GenericValue();
- m->value.~GenericValue();
- }
- Allocator::Free(data_.o.members);
- break;
-
- case kCopyStringFlag:
- Allocator::Free(const_cast<Ch*>(data_.s.str));
- break;
- }
- }
- }
-
- //@}
-
- //!@name Assignment operators
- //@{
-
- //! Assignment with move semantics.
- /*! \param rhs Source of the assignment. It will become a null value after assignment.
- */
- GenericValue& operator=(GenericValue& rhs) {
- RAPIDJSON_ASSERT(this != &rhs);
- this->~GenericValue();
- memcpy(this, &rhs, sizeof(GenericValue));
- rhs.flags_ = kNullFlag;
- return *this;
- }
-
- //! Assignment with primitive types.
- /*! \tparam T Either Type, int, unsigned, int64_t, uint64_t, const Ch*
- \param value The value to be assigned.
- */
- template <typename T>
- GenericValue& operator=(T value) {
- this->~GenericValue();
- new (this) GenericValue(value);
- return *this;
- }
- //@}
-
- //!@name Type
- //@{
-
- Type GetType() const { return static_cast<Type>(flags_ & kTypeMask); }
- bool IsNull() const { return flags_ == kNullFlag; }
- bool IsFalse() const { return flags_ == kFalseFlag; }
- bool IsTrue() const { return flags_ == kTrueFlag; }
- bool IsBool() const { return (flags_ & kBoolFlag) != 0; }
- bool IsObject() const { return flags_ == kObjectFlag; }
- bool IsArray() const { return flags_ == kArrayFlag; }
- bool IsNumber() const { return (flags_ & kNumberFlag) != 0; }
- bool IsInt() const { return (flags_ & kIntFlag) != 0; }
- bool IsUint() const { return (flags_ & kUintFlag) != 0; }
- bool IsInt64() const { return (flags_ & kInt64Flag) != 0; }
- bool IsUint64() const { return (flags_ & kUint64Flag) != 0; }
- bool IsDouble() const { return (flags_ & kDoubleFlag) != 0; }
- bool IsString() const { return (flags_ & kStringFlag) != 0; }
-
- //@}
-
- //!@name Null
- //@{
-
- GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; }
-
- //@}
-
- //!@name Bool
- //@{
-
- bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return flags_ == kTrueFlag; }
- GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; }
-
- //@}
-
- //!@name Object
- //@{
-
- //! Set this value as an empty object.
- GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; }
-
- //! Get the value associated with the object's name.
- GenericValue& operator[](const Ch* name) {
- if (Member* member = FindMember(name))
- return member->value;
- else {
- static GenericValue NullValue;
- return NullValue;
- }
- }
- const GenericValue& operator[](const Ch* name) const { return const_cast<GenericValue&>(*this)[name]; }
-
- //! Member iterators.
- ConstMemberIterator MemberBegin() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.members; }
- ConstMemberIterator MemberEnd() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.members + data_.o.size; }
- MemberIterator MemberBegin() { RAPIDJSON_ASSERT(IsObject()); return data_.o.members; }
- MemberIterator MemberEnd() { RAPIDJSON_ASSERT(IsObject()); return data_.o.members + data_.o.size; }
-
- //! Check whether a member exists in the object.
- bool HasMember(const Ch* name) const { return FindMember(name) != 0; }
-
- //! Add a member (name-value pair) to the object.
- /*! \param name A string value as name of member.
- \param value Value of any type.
- \param allocator Allocator for reallocating memory.
- \return The value itself for fluent API.
- \note The ownership of name and value will be transfered to this object if success.
- */
- GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) {
- RAPIDJSON_ASSERT(IsObject());
- RAPIDJSON_ASSERT(name.IsString());
- Object& o = data_.o;
- if (o.size >= o.capacity) {
- if (o.capacity == 0) {
- o.capacity = kDefaultObjectCapacity;
- o.members = (Member*)allocator.Malloc(o.capacity * sizeof(Member));
- }
- else {
- SizeType oldCapacity = o.capacity;
- o.capacity *= 2;
- o.members = (Member*)allocator.Realloc(o.members, oldCapacity * sizeof(Member), o.capacity * sizeof(Member));
- }
- }
- o.members[o.size].name.RawAssign(name);
- o.members[o.size].value.RawAssign(value);
- o.size++;
- return *this;
- }
-
- GenericValue& AddMember(const Ch* name, Allocator& nameAllocator, GenericValue& value, Allocator& allocator) {
- GenericValue n(name, internal::StrLen(name), nameAllocator);
- return AddMember(n, value, allocator);
- }
-
- GenericValue& AddMember(const Ch* name, GenericValue& value, Allocator& allocator) {
- GenericValue n(name, internal::StrLen(name));
- return AddMember(n, value, allocator);
- }
-
- template <typename T>
- GenericValue& AddMember(const Ch* name, T value, Allocator& allocator) {
- GenericValue n(name, internal::StrLen(name));
- GenericValue v(value);
- return AddMember(n, v, allocator);
- }
-
- //! Remove a member in object by its name.
- /*! \param name Name of member to be removed.
- \return Whether the member existed.
- \note Removing member is implemented by moving the last member. So the ordering of members is changed.
- */
- bool RemoveMember(const Ch* name) {
- RAPIDJSON_ASSERT(IsObject());
- if (Member* m = FindMember(name)) {
- RAPIDJSON_ASSERT(data_.o.size > 0);
- RAPIDJSON_ASSERT(data_.o.members != 0);
-
- Member* last = data_.o.members + (data_.o.size - 1);
- if (data_.o.size > 1 && m != last) {
- // Move the last one to this place
- m->name = last->name;
- m->value = last->value;
- }
- else {
- // Only one left, just destroy
- m->name.~GenericValue();
- m->value.~GenericValue();
- }
- --data_.o.size;
- return true;
- }
- return false;
- }
-
- //@}
-
- //!@name Array
- //@{
-
- //! Set this value as an empty array.
- GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; }
-
- //! Get the number of elements in array.
- SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; }
-
- //! Get the capacity of array.
- SizeType Capacity() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; }
-
- //! Check whether the array is empty.
- bool Empty() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; }
-
- //! Remove all elements in the array.
- /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged.
- */
- void Clear() {
- RAPIDJSON_ASSERT(IsArray());
- for (SizeType i = 0; i < data_.a.size; ++i)
- data_.a.elements[i].~GenericValue();
- data_.a.size = 0;
- }
-
- //! Get an element from array by index.
- /*! \param index Zero-based index of element.
- \note
-\code
-Value a(kArrayType);
-a.PushBack(123);
-int x = a[0].GetInt(); // Error: operator[ is ambiguous, as 0 also mean a null pointer of const char* type.
-int y = a[SizeType(0)].GetInt(); // Cast to SizeType will work.
-int z = a[0u].GetInt(); // This works too.
-\endcode
- */
- GenericValue& operator[](SizeType index) {
- RAPIDJSON_ASSERT(IsArray());
- RAPIDJSON_ASSERT(index < data_.a.size);
- return data_.a.elements[index];
- }
- const GenericValue& operator[](SizeType index) const { return const_cast<GenericValue&>(*this)[index]; }
-
- //! Element iterator
- ValueIterator Begin() { RAPIDJSON_ASSERT(IsArray()); return data_.a.elements; }
- ValueIterator End() { RAPIDJSON_ASSERT(IsArray()); return data_.a.elements + data_.a.size; }
- ConstValueIterator Begin() const { return const_cast<GenericValue&>(*this).Begin(); }
- ConstValueIterator End() const { return const_cast<GenericValue&>(*this).End(); }
-
- //! Request the array to have enough capacity to store elements.
- /*! \param newCapacity The capacity that the array at least need to have.
- \param allocator The allocator for allocating memory. It must be the same one use previously.
- \return The value itself for fluent API.
- */
- GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) {
- RAPIDJSON_ASSERT(IsArray());
- if (newCapacity > data_.a.capacity) {
- data_.a.elements = (GenericValue*)allocator.Realloc(data_.a.elements, data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue));
- data_.a.capacity = newCapacity;
- }
- return *this;
- }
-
- //! Append a value at the end of the array.
- /*! \param value The value to be appended.
- \param allocator The allocator for allocating memory. It must be the same one use previously.
- \return The value itself for fluent API.
- \note The ownership of the value will be transfered to this object if success.
- \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient.
- */
- GenericValue& PushBack(GenericValue& value, Allocator& allocator) {
- RAPIDJSON_ASSERT(IsArray());
- if (data_.a.size >= data_.a.capacity)
- Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : data_.a.capacity * 2, allocator);
- data_.a.elements[data_.a.size++].RawAssign(value);
- return *this;
- }
-
- template <typename T>
- GenericValue& PushBack(T value, Allocator& allocator) {
- GenericValue v(value);
- return PushBack(v, allocator);
- }
-
- //! Remove the last element in the array.
- GenericValue& PopBack() {
- RAPIDJSON_ASSERT(IsArray());
- RAPIDJSON_ASSERT(!Empty());
- data_.a.elements[--data_.a.size].~GenericValue();
- return *this;
- }
- //@}
-
- //!@name Number
- //@{
-
- int GetInt() const { RAPIDJSON_ASSERT(flags_ & kIntFlag); return data_.n.i.i; }
- unsigned GetUint() const { RAPIDJSON_ASSERT(flags_ & kUintFlag); return data_.n.u.u; }
- int64_t GetInt64() const { RAPIDJSON_ASSERT(flags_ & kInt64Flag); return data_.n.i64; }
- uint64_t GetUint64() const { RAPIDJSON_ASSERT(flags_ & kUint64Flag); return data_.n.u64; }
-
- double GetDouble() const {
- RAPIDJSON_ASSERT(IsNumber());
- if ((flags_ & kDoubleFlag) != 0) return data_.n.d; // exact type, no conversion.
- if ((flags_ & kIntFlag) != 0) return data_.n.i.i; // int -> double
- if ((flags_ & kUintFlag) != 0) return data_.n.u.u; // unsigned -> double
- if ((flags_ & kInt64Flag) != 0) return (double)data_.n.i64; // int64_t -> double (may lose precision)
- RAPIDJSON_ASSERT((flags_ & kUint64Flag) != 0); return (double)data_.n.u64; // uint64_t -> double (may lose precision)
- }
-
- GenericValue& SetInt(int i) { this->~GenericValue(); new (this) GenericValue(i); return *this; }
- GenericValue& SetUint(unsigned u) { this->~GenericValue(); new (this) GenericValue(u); return *this; }
- GenericValue& SetInt64(int64_t i64) { this->~GenericValue(); new (this) GenericValue(i64); return *this; }
- GenericValue& SetUint64(uint64_t u64) { this->~GenericValue(); new (this) GenericValue(u64); return *this; }
- GenericValue& SetDouble(double d) { this->~GenericValue(); new (this) GenericValue(d); return *this; }
-
- //@}
-
- //!@name String
- //@{
-
- const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return data_.s.str; }
-
- //! Get the length of string.
- /*! Since rapidjson permits "\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength().
- */
- SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return data_.s.length; }
-
- //! Set this value as a string without copying source string.
- /*! This version has better performance with supplied length, and also support string containing null character.
- \param s source string pointer.
- \param length The length of source string, excluding the trailing null terminator.
- \return The value itself for fluent API.
- */
- GenericValue& SetString(const Ch* s, SizeType length) { this->~GenericValue(); SetStringRaw(s, length); return *this; }
-
- //! Set this value as a string without copying source string.
- /*! \param s source string pointer.
- \return The value itself for fluent API.
- */
- GenericValue& SetString(const Ch* s) { return SetString(s, internal::StrLen(s)); }
-
- //! Set this value as a string by copying from source string.
- /*! This version has better performance with supplied length, and also support string containing null character.
- \param s source string.
- \param length The length of source string, excluding the trailing null terminator.
- \param allocator Allocator for allocating copied buffer. Commonly use document.GetAllocator().
- \return The value itself for fluent API.
- */
- GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { this->~GenericValue(); SetStringRaw(s, length, allocator); return *this; }
-
- //! Set this value as a string by copying from source string.
- /*! \param s source string.
- \param allocator Allocator for allocating copied buffer. Commonly use document.GetAllocator().
- \return The value itself for fluent API.
- */
- GenericValue& SetString(const Ch* s, Allocator& allocator) { SetString(s, internal::StrLen(s), allocator); return *this; }
-
- //@}
-
- //! Generate events of this value to a Handler.
- /*! This function adopts the GoF visitor pattern.
- Typical usage is to output this JSON value as JSON text via Writer, which is a Handler.
- It can also be used to deep clone this value via GenericDocument, which is also a Handler.
- \tparam Handler type of handler.
- \param handler An object implementing concept Handler.
- */
- template <typename Handler>
- const GenericValue& Accept(Handler& handler) const {
- switch(GetType()) {
- case kNullType: handler.Null(); break;
- case kFalseType: handler.Bool(false); break;
- case kTrueType: handler.Bool(true); break;
-
- case kObjectType:
- handler.StartObject();
- for (Member* m = data_.o.members; m != data_.o.members + data_.o.size; ++m) {
- handler.String(m->name.data_.s.str, m->name.data_.s.length, false);
- m->value.Accept(handler);
- }
- handler.EndObject(data_.o.size);
- break;
-
- case kArrayType:
- handler.StartArray();
- for (GenericValue* v = data_.a.elements; v != data_.a.elements + data_.a.size; ++v)
- v->Accept(handler);
- handler.EndArray(data_.a.size);
- break;
-
- case kStringType:
- handler.String(data_.s.str, data_.s.length, false);
- break;
-
- case kNumberType:
- if (IsInt()) handler.Int(data_.n.i.i);
- else if (IsUint()) handler.Uint(data_.n.u.u);
- else if (IsInt64()) handler.Int64(data_.n.i64);
- else if (IsUint64()) handler.Uint64(data_.n.u64);
- else handler.Double(data_.n.d);
- break;
- }
- return *this;
- }
-
-private:
- template <typename, typename>
- friend class GenericDocument;
-
- enum {
- kBoolFlag = 0x100,
- kNumberFlag = 0x200,
- kIntFlag = 0x400,
- kUintFlag = 0x800,
- kInt64Flag = 0x1000,
- kUint64Flag = 0x2000,
- kDoubleFlag = 0x4000,
- kStringFlag = 0x100000,
- kCopyFlag = 0x200000,
-
- // Initial flags of different types.
- kNullFlag = kNullType,
- kTrueFlag = kTrueType | kBoolFlag,
- kFalseFlag = kFalseType | kBoolFlag,
- kNumberIntFlag = kNumberType | kNumberFlag | kIntFlag | kInt64Flag,
- kNumberUintFlag = kNumberType | kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag,
- kNumberInt64Flag = kNumberType | kNumberFlag | kInt64Flag,
- kNumberUint64Flag = kNumberType | kNumberFlag | kUint64Flag,
- kNumberDoubleFlag = kNumberType | kNumberFlag | kDoubleFlag,
- kConstStringFlag = kStringType | kStringFlag,
- kCopyStringFlag = kStringType | kStringFlag | kCopyFlag,
- kObjectFlag = kObjectType,
- kArrayFlag = kArrayType,
-
- kTypeMask = 0xFF // bitwise-and with mask of 0xFF can be optimized by compiler
- };
-
- static const SizeType kDefaultArrayCapacity = 16;
- static const SizeType kDefaultObjectCapacity = 16;
-
- struct String {
- const Ch* str;
- SizeType length;
- unsigned hashcode; //!< reserved
- }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode
-
- // By using proper binary layout, retrieval of different integer types do not need conversions.
- union Number {
-#if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN
- struct I {
- int i;
- char padding[4];
- }i;
- struct U {
- unsigned u;
- char padding2[4];
- }u;
-#else
- struct I {
- char padding[4];
- int i;
- }i;
- struct U {
- char padding2[4];
- unsigned u;
- }u;
-#endif
- int64_t i64;
- uint64_t u64;
- double d;
- }; // 8 bytes
-
- struct Object {
- Member* members;
- SizeType size;
- SizeType capacity;
- }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode
-
- struct Array {
- GenericValue<Encoding, Allocator>* elements;
- SizeType size;
- SizeType capacity;
- }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode
-
- union Data {
- String s;
- Number n;
- Object o;
- Array a;
- }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode
-
- //! Find member by name.
- Member* FindMember(const Ch* name) {
- RAPIDJSON_ASSERT(name);
- RAPIDJSON_ASSERT(IsObject());
-
- SizeType length = internal::StrLen(name);
-
- Object& o = data_.o;
- for (Member* member = o.members; member != data_.o.members + data_.o.size; ++member)
- if (length == member->name.data_.s.length && memcmp(member->name.data_.s.str, name, length * sizeof(Ch)) == 0)
- return member;
-
- return 0;
- }
- const Member* FindMember(const Ch* name) const { return const_cast<GenericValue&>(*this).FindMember(name); }
-
- // Initialize this value as array with initial data, without calling destructor.
- void SetArrayRaw(GenericValue* values, SizeType count, Allocator& alloctaor) {
- flags_ = kArrayFlag;
- data_.a.elements = (GenericValue*)alloctaor.Malloc(count * sizeof(GenericValue));
- memcpy(data_.a.elements, values, count * sizeof(GenericValue));
- data_.a.size = data_.a.capacity = count;
- }
-
- //! Initialize this value as object with initial data, without calling destructor.
- void SetObjectRaw(Member* members, SizeType count, Allocator& alloctaor) {
- flags_ = kObjectFlag;
- data_.o.members = (Member*)alloctaor.Malloc(count * sizeof(Member));
- memcpy(data_.o.members, members, count * sizeof(Member));
- data_.o.size = data_.o.capacity = count;
- }
-
- //! Initialize this value as constant string, without calling destructor.
- void SetStringRaw(const Ch* s, SizeType length) {
- RAPIDJSON_ASSERT(s != NULL);
- flags_ = kConstStringFlag;
- data_.s.str = s;
- data_.s.length = length;
- }
-
- //! Initialize this value as copy string with initial data, without calling destructor.
- void SetStringRaw(const Ch* s, SizeType length, Allocator& allocator) {
- RAPIDJSON_ASSERT(s != NULL);
- flags_ = kCopyStringFlag;
- data_.s.str = (Ch *)allocator.Malloc((length + 1) * sizeof(Ch));
- data_.s.length = length;
- memcpy(const_cast<Ch*>(data_.s.str), s, length * sizeof(Ch));
- const_cast<Ch*>(data_.s.str)[length] = '\0';
- }
-
- //! Assignment without calling destructor
- void RawAssign(GenericValue& rhs) {
- memcpy(this, &rhs, sizeof(GenericValue));
- rhs.flags_ = kNullFlag;
- }
-
- Data data_;
- unsigned flags_;
-};
-#pragma pack (pop)
-
-//! Value with UTF8 encoding.
-typedef GenericValue<UTF8<> > Value;
-
-///////////////////////////////////////////////////////////////////////////////
-// GenericDocument
-
-//! A document for parsing JSON text as DOM.
-/*!
- \implements Handler
- \tparam Encoding encoding for both parsing and string storage.
- \tparam Alloactor allocator for allocating memory for the DOM, and the stack during parsing.
-*/
-template <typename Encoding, typename Allocator = MemoryPoolAllocator<> >
-class GenericDocument : public GenericValue<Encoding, Allocator> {
-public:
- typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding.
- typedef GenericValue<Encoding, Allocator> ValueType; //!< Value type of the document.
- typedef Allocator AllocatorType; //!< Allocator type from template parameter.
-
- //! Constructor
- /*! \param allocator Optional allocator for allocating stack memory.
- \param stackCapacity Initial capacity of stack in bytes.
- */
- GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity) : stack_(allocator, stackCapacity), parseError_(0), errorOffset_(0) {}
-
- //! Parse JSON text from an input stream.
- /*! \tparam parseFlags Combination of ParseFlag.
- \param stream Input stream to be parsed.
- \return The document itself for fluent API.
- */
- template <unsigned parseFlags, typename Stream>
- GenericDocument& ParseStream(Stream& stream) {
- ValueType::SetNull(); // Remove existing root if exist
- GenericReader<Encoding, Allocator> reader;
- if (reader.template Parse<parseFlags>(stream, *this)) {
- RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object
- this->RawAssign(*stack_.template Pop<ValueType>(1)); // Add this-> to prevent issue 13.
- parseError_ = 0;
- errorOffset_ = 0;
- }
- else {
- parseError_ = reader.GetParseError();
- errorOffset_ = reader.GetErrorOffset();
- ClearStack();
- }
- return *this;
- }
-
- //! Parse JSON text from a mutable string.
- /*! \tparam parseFlags Combination of ParseFlag.
- \param str Mutable zero-terminated string to be parsed.
- \return The document itself for fluent API.
- */
- template <unsigned parseFlags>
- GenericDocument& ParseInsitu(Ch* str) {
- GenericInsituStringStream<Encoding> s(str);
- return ParseStream<parseFlags | kParseInsituFlag>(s);
- }
-
- //! Parse JSON text from a read-only string.
- /*! \tparam parseFlags Combination of ParseFlag (must not contain kParseInsituFlag).
- \param str Read-only zero-terminated string to be parsed.
- */
- template <unsigned parseFlags>
- GenericDocument& Parse(const Ch* str) {
- RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag));
- GenericStringStream<Encoding> s(str);
- return ParseStream<parseFlags>(s);
- }
-
- //! Whether a parse error was occured in the last parsing.
- bool HasParseError() const { return parseError_ != 0; }
-
- //! Get the message of parsing error.
- const char* GetParseError() const { return parseError_; }
-
- //! Get the offset in character of the parsing error.
- size_t GetErrorOffset() const { return errorOffset_; }
-
- //! Get the allocator of this document.
- Allocator& GetAllocator() { return stack_.GetAllocator(); }
-
- //! Get the capacity of stack in bytes.
- size_t GetStackCapacity() const { return stack_.GetCapacity(); }
-
-private:
- // Prohibit assignment
- GenericDocument& operator=(const GenericDocument&);
-
- friend class GenericReader<Encoding, Allocator>; // for Reader to call the following private handler functions
-
- // Implementation of Handler
- void Null() { new (stack_.template Push<ValueType>()) ValueType(); }
- void Bool(bool b) { new (stack_.template Push<ValueType>()) ValueType(b); }
- void Int(int i) { new (stack_.template Push<ValueType>()) ValueType(i); }
- void Uint(unsigned i) { new (stack_.template Push<ValueType>()) ValueType(i); }
- void Int64(int64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); }
- void Uint64(uint64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); }
- void Double(double d) { new (stack_.template Push<ValueType>()) ValueType(d); }
-
- void String(const Ch* str, SizeType length, bool copy) {
- if (copy)
- new (stack_.template Push<ValueType>()) ValueType(str, length, GetAllocator());
- else
- new (stack_.template Push<ValueType>()) ValueType(str, length);
- }
-
- void StartObject() { new (stack_.template Push<ValueType>()) ValueType(kObjectType); }
-
- void EndObject(SizeType memberCount) {
- typename ValueType::Member* members = stack_.template Pop<typename ValueType::Member>(memberCount);
- stack_.template Top<ValueType>()->SetObjectRaw(members, (SizeType)memberCount, GetAllocator());
- }
-
- void StartArray() { new (stack_.template Push<ValueType>()) ValueType(kArrayType); }
-
- void EndArray(SizeType elementCount) {
- ValueType* elements = stack_.template Pop<ValueType>(elementCount);
- stack_.template Top<ValueType>()->SetArrayRaw(elements, elementCount, GetAllocator());
- }
-
- void ClearStack() {
- if (Allocator::kNeedFree)
- while (stack_.GetSize() > 0) // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects)
- (stack_.template Pop<ValueType>(1))->~ValueType();
- else
- stack_.Clear();
- }
-
- static const size_t kDefaultStackCapacity = 1024;
- internal::Stack<Allocator> stack_;
- const char* parseError_;
- size_t errorOffset_;
-};
-
-typedef GenericDocument<UTF8<> > Document;
-
-} // namespace rapidjson
-
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
-
-#endif // RAPIDJSON_DOCUMENT_H_
diff --git a/include/rapidjson/filestream.h b/include/rapidjson/filestream.h
deleted file mode 100755
index 885894963f..0000000000
--- a/include/rapidjson/filestream.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef RAPIDJSON_FILESTREAM_H_
-#define RAPIDJSON_FILESTREAM_H_
-
-#include <cstdio>
-
-namespace rapidjson {
-
-//! Wrapper of C file stream for input or output.
-/*!
- This simple wrapper does not check the validity of the stream.
- \implements Stream
-*/
-class FileStream {
-public:
- typedef char Ch; //!< Character type. Only support char.
-
- FileStream(FILE* fp) : fp_(fp), count_(0) { Read(); }
- char Peek() const { return current_; }
- char Take() { char c = current_; Read(); return c; }
- size_t Tell() const { return count_; }
- void Put(char c) { fputc(c, fp_); }
-
- // Not implemented
- char* PutBegin() { return 0; }
- size_t PutEnd(char*) { return 0; }
-
-private:
- void Read() {
- RAPIDJSON_ASSERT(fp_ != 0);
- int c = fgetc(fp_);
- if (c != EOF) {
- current_ = (char)c;
- count_++;
- }
- else
- current_ = '\0';
- }
-
- FILE* fp_;
- char current_;
- size_t count_;
-};
-
-} // namespace rapidjson
-
-#endif // RAPIDJSON_FILESTREAM_H_
diff --git a/include/rapidjson/internal/pow10.h b/include/rapidjson/internal/pow10.h
deleted file mode 100755
index bf3a9afb04..0000000000
--- a/include/rapidjson/internal/pow10.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef RAPIDJSON_POW10_
-#define RAPIDJSON_POW10_
-
-namespace rapidjson {
-namespace internal {
-
-//! Computes integer powers of 10 in double (10.0^n).
-/*! This function uses lookup table for fast and accurate results.
- \param n positive/negative exponent. Must <= 308.
- \return 10.0^n
-*/
-inline double Pow10(int n) {
- static const double e[] = { // 1e-308...1e308: 617 * 8 bytes = 4936 bytes
- 1e-308,1e-307,1e-306,1e-305,1e-304,1e-303,1e-302,1e-301,1e-300,
- 1e-299,1e-298,1e-297,1e-296,1e-295,1e-294,1e-293,1e-292,1e-291,1e-290,1e-289,1e-288,1e-287,1e-286,1e-285,1e-284,1e-283,1e-282,1e-281,1e-280,
- 1e-279,1e-278,1e-277,1e-276,1e-275,1e-274,1e-273,1e-272,1e-271,1e-270,1e-269,1e-268,1e-267,1e-266,1e-265,1e-264,1e-263,1e-262,1e-261,1e-260,
- 1e-259,1e-258,1e-257,1e-256,1e-255,1e-254,1e-253,1e-252,1e-251,1e-250,1e-249,1e-248,1e-247,1e-246,1e-245,1e-244,1e-243,1e-242,1e-241,1e-240,
- 1e-239,1e-238,1e-237,1e-236,1e-235,1e-234,1e-233,1e-232,1e-231,1e-230,1e-229,1e-228,1e-227,1e-226,1e-225,1e-224,1e-223,1e-222,1e-221,1e-220,
- 1e-219,1e-218,1e-217,1e-216,1e-215,1e-214,1e-213,1e-212,1e-211,1e-210,1e-209,1e-208,1e-207,1e-206,1e-205,1e-204,1e-203,1e-202,1e-201,1e-200,
- 1e-199,1e-198,1e-197,1e-196,1e-195,1e-194,1e-193,1e-192,1e-191,1e-190,1e-189,1e-188,1e-187,1e-186,1e-185,1e-184,1e-183,1e-182,1e-181,1e-180,
- 1e-179,1e-178,1e-177,1e-176,1e-175,1e-174,1e-173,1e-172,1e-171,1e-170,1e-169,1e-168,1e-167,1e-166,1e-165,1e-164,1e-163,1e-162,1e-161,1e-160,
- 1e-159,1e-158,1e-157,1e-156,1e-155,1e-154,1e-153,1e-152,1e-151,1e-150,1e-149,1e-148,1e-147,1e-146,1e-145,1e-144,1e-143,1e-142,1e-141,1e-140,
- 1e-139,1e-138,1e-137,1e-136,1e-135,1e-134,1e-133,1e-132,1e-131,1e-130,1e-129,1e-128,1e-127,1e-126,1e-125,1e-124,1e-123,1e-122,1e-121,1e-120,
- 1e-119,1e-118,1e-117,1e-116,1e-115,1e-114,1e-113,1e-112,1e-111,1e-110,1e-109,1e-108,1e-107,1e-106,1e-105,1e-104,1e-103,1e-102,1e-101,1e-100,
- 1e-99, 1e-98, 1e-97, 1e-96, 1e-95, 1e-94, 1e-93, 1e-92, 1e-91, 1e-90, 1e-89, 1e-88, 1e-87, 1e-86, 1e-85, 1e-84, 1e-83, 1e-82, 1e-81, 1e-80,
- 1e-79, 1e-78, 1e-77, 1e-76, 1e-75, 1e-74, 1e-73, 1e-72, 1e-71, 1e-70, 1e-69, 1e-68, 1e-67, 1e-66, 1e-65, 1e-64, 1e-63, 1e-62, 1e-61, 1e-60,
- 1e-59, 1e-58, 1e-57, 1e-56, 1e-55, 1e-54, 1e-53, 1e-52, 1e-51, 1e-50, 1e-49, 1e-48, 1e-47, 1e-46, 1e-45, 1e-44, 1e-43, 1e-42, 1e-41, 1e-40,
- 1e-39, 1e-38, 1e-37, 1e-36, 1e-35, 1e-34, 1e-33, 1e-32, 1e-31, 1e-30, 1e-29, 1e-28, 1e-27, 1e-26, 1e-25, 1e-24, 1e-23, 1e-22, 1e-21, 1e-20,
- 1e-19, 1e-18, 1e-17, 1e-16, 1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1e+0,
- 1e+1, 1e+2, 1e+3, 1e+4, 1e+5, 1e+6, 1e+7, 1e+8, 1e+9, 1e+10, 1e+11, 1e+12, 1e+13, 1e+14, 1e+15, 1e+16, 1e+17, 1e+18, 1e+19, 1e+20,
- 1e+21, 1e+22, 1e+23, 1e+24, 1e+25, 1e+26, 1e+27, 1e+28, 1e+29, 1e+30, 1e+31, 1e+32, 1e+33, 1e+34, 1e+35, 1e+36, 1e+37, 1e+38, 1e+39, 1e+40,
- 1e+41, 1e+42, 1e+43, 1e+44, 1e+45, 1e+46, 1e+47, 1e+48, 1e+49, 1e+50, 1e+51, 1e+52, 1e+53, 1e+54, 1e+55, 1e+56, 1e+57, 1e+58, 1e+59, 1e+60,
- 1e+61, 1e+62, 1e+63, 1e+64, 1e+65, 1e+66, 1e+67, 1e+68, 1e+69, 1e+70, 1e+71, 1e+72, 1e+73, 1e+74, 1e+75, 1e+76, 1e+77, 1e+78, 1e+79, 1e+80,
- 1e+81, 1e+82, 1e+83, 1e+84, 1e+85, 1e+86, 1e+87, 1e+88, 1e+89, 1e+90, 1e+91, 1e+92, 1e+93, 1e+94, 1e+95, 1e+96, 1e+97, 1e+98, 1e+99, 1e+100,
- 1e+101,1e+102,1e+103,1e+104,1e+105,1e+106,1e+107,1e+108,1e+109,1e+110,1e+111,1e+112,1e+113,1e+114,1e+115,1e+116,1e+117,1e+118,1e+119,1e+120,
- 1e+121,1e+122,1e+123,1e+124,1e+125,1e+126,1e+127,1e+128,1e+129,1e+130,1e+131,1e+132,1e+133,1e+134,1e+135,1e+136,1e+137,1e+138,1e+139,1e+140,
- 1e+141,1e+142,1e+143,1e+144,1e+145,1e+146,1e+147,1e+148,1e+149,1e+150,1e+151,1e+152,1e+153,1e+154,1e+155,1e+156,1e+157,1e+158,1e+159,1e+160,
- 1e+161,1e+162,1e+163,1e+164,1e+165,1e+166,1e+167,1e+168,1e+169,1e+170,1e+171,1e+172,1e+173,1e+174,1e+175,1e+176,1e+177,1e+178,1e+179,1e+180,
- 1e+181,1e+182,1e+183,1e+184,1e+185,1e+186,1e+187,1e+188,1e+189,1e+190,1e+191,1e+192,1e+193,1e+194,1e+195,1e+196,1e+197,1e+198,1e+199,1e+200,
- 1e+201,1e+202,1e+203,1e+204,1e+205,1e+206,1e+207,1e+208,1e+209,1e+210,1e+211,1e+212,1e+213,1e+214,1e+215,1e+216,1e+217,1e+218,1e+219,1e+220,
- 1e+221,1e+222,1e+223,1e+224,1e+225,1e+226,1e+227,1e+228,1e+229,1e+230,1e+231,1e+232,1e+233,1e+234,1e+235,1e+236,1e+237,1e+238,1e+239,1e+240,
- 1e+241,1e+242,1e+243,1e+244,1e+245,1e+246,1e+247,1e+248,1e+249,1e+250,1e+251,1e+252,1e+253,1e+254,1e+255,1e+256,1e+257,1e+258,1e+259,1e+260,
- 1e+261,1e+262,1e+263,1e+264,1e+265,1e+266,1e+267,1e+268,1e+269,1e+270,1e+271,1e+272,1e+273,1e+274,1e+275,1e+276,1e+277,1e+278,1e+279,1e+280,
- 1e+281,1e+282,1e+283,1e+284,1e+285,1e+286,1e+287,1e+288,1e+289,1e+290,1e+291,1e+292,1e+293,1e+294,1e+295,1e+296,1e+297,1e+298,1e+299,1e+300,
- 1e+301,1e+302,1e+303,1e+304,1e+305,1e+306,1e+307,1e+308
- };
- RAPIDJSON_ASSERT(n <= 308);
- return n < -308 ? 0.0 : e[n + 308];
-}
-
-} // namespace internal
-} // namespace rapidjson
-
-#endif // RAPIDJSON_POW10_
diff --git a/include/rapidjson/internal/stack.h b/include/rapidjson/internal/stack.h
deleted file mode 100755
index 966893b3fc..0000000000
--- a/include/rapidjson/internal/stack.h
+++ /dev/null
@@ -1,82 +0,0 @@
-#ifndef RAPIDJSON_INTERNAL_STACK_H_
-#define RAPIDJSON_INTERNAL_STACK_H_
-
-namespace rapidjson {
-namespace internal {
-
-///////////////////////////////////////////////////////////////////////////////
-// Stack
-
-//! A type-unsafe stack for storing different types of data.
-/*! \tparam Allocator Allocator for allocating stack memory.
-*/
-template <typename Allocator>
-class Stack {
-public:
- Stack(Allocator* allocator, size_t stack_capacity) : allocator_(allocator), own_allocator_(0), stack_(0), stack_top_(0), stack_end_(0), stack_capacity_(stack_capacity) {
- RAPIDJSON_ASSERT(stack_capacity_ > 0);
- if (!allocator_)
- own_allocator_ = allocator_ = new Allocator();
- stack_top_ = stack_ = (char*)allocator_->Malloc(stack_capacity_);
- stack_end_ = stack_ + stack_capacity_;
- }
-
- ~Stack() {
- Allocator::Free(stack_);
- delete own_allocator_; // Only delete if it is owned by the stack
- }
-
- void Clear() { /*stack_top_ = 0;*/ stack_top_ = stack_; }
-
- template<typename T>
- T* Push(size_t count = 1) {
- // Expand the stack if needed
- if (stack_top_ + sizeof(T) * count >= stack_end_) {
- size_t new_capacity = stack_capacity_ * 2;
- size_t size = GetSize();
- size_t new_size = GetSize() + sizeof(T) * count;
- if (new_capacity < new_size)
- new_capacity = new_size;
- stack_ = (char*)allocator_->Realloc(stack_, stack_capacity_, new_capacity);
- stack_capacity_ = new_capacity;
- stack_top_ = stack_ + size;
- stack_end_ = stack_ + stack_capacity_;
- }
- T* ret = (T*)stack_top_;
- stack_top_ += sizeof(T) * count;
- return ret;
- }
-
- template<typename T>
- T* Pop(size_t count) {
- RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T));
- stack_top_ -= count * sizeof(T);
- return (T*)stack_top_;
- }
-
- template<typename T>
- T* Top() {
- RAPIDJSON_ASSERT(GetSize() >= sizeof(T));
- return (T*)(stack_top_ - sizeof(T));
- }
-
- template<typename T>
- T* Bottom() { return (T*)stack_; }
-
- Allocator& GetAllocator() { return *allocator_; }
- size_t GetSize() const { return stack_top_ - stack_; }
- size_t GetCapacity() const { return stack_capacity_; }
-
-private:
- Allocator* allocator_;
- Allocator* own_allocator_;
- char *stack_;
- char *stack_top_;
- char *stack_end_;
- size_t stack_capacity_;
-};
-
-} // namespace internal
-} // namespace rapidjson
-
-#endif // RAPIDJSON_STACK_H_
diff --git a/include/rapidjson/internal/strfunc.h b/include/rapidjson/internal/strfunc.h
deleted file mode 100755
index bbf444fe6d..0000000000
--- a/include/rapidjson/internal/strfunc.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef RAPIDJSON_INTERNAL_STRFUNC_H_
-#define RAPIDJSON_INTERNAL_STRFUNC_H_
-
-namespace rapidjson {
-namespace internal {
-
-//! Custom strlen() which works on different character types.
-/*! \tparam Ch Character type (e.g. char, wchar_t, short)
- \param s Null-terminated input string.
- \return Number of characters in the string.
- \note This has the same semantics as strlen(), the return value is not number of Unicode codepoints.
-*/
-template <typename Ch>
-inline SizeType StrLen(const Ch* s) {
- const Ch* p = s;
- while (*p != '\0')
- ++p;
- return SizeType(p - s);
-}
-
-} // namespace internal
-} // namespace rapidjson
-
-#endif // RAPIDJSON_INTERNAL_STRFUNC_H_
diff --git a/include/rapidjson/prettywriter.h b/include/rapidjson/prettywriter.h
deleted file mode 100755
index 238ff5ff62..0000000000
--- a/include/rapidjson/prettywriter.h
+++ /dev/null
@@ -1,156 +0,0 @@
-#ifndef RAPIDJSON_PRETTYWRITER_H_
-#define RAPIDJSON_PRETTYWRITER_H_
-
-#include "writer.h"
-
-namespace rapidjson {
-
-//! Writer with indentation and spacing.
-/*!
- \tparam Stream Type of ouptut stream.
- \tparam Encoding Encoding of both source strings and output.
- \tparam Allocator Type of allocator for allocating memory of stack.
-*/
-template<typename Stream, typename Encoding = UTF8<>, typename Allocator = MemoryPoolAllocator<> >
-class PrettyWriter : public Writer<Stream, Encoding, Allocator> {
-public:
- typedef Writer<Stream, Encoding, Allocator> Base;
- typedef typename Base::Ch Ch;
-
- //! Constructor
- /*! \param stream Output stream.
- \param allocator User supplied allocator. If it is null, it will create a private one.
- \param levelDepth Initial capacity of
- */
- PrettyWriter(Stream& stream, Allocator* allocator = 0, size_t levelDepth = Base::kDefaultLevelDepth) :
- Base(stream, allocator, levelDepth), indentChar_(' '), indentCharCount_(4) {}
-
- //! Set custom indentation.
- /*! \param indentChar Character for indentation. Must be whitespace character (' ', '\t', '\n', '\r').
- \param indentCharCount Number of indent characters for each indentation level.
- \note The default indentation is 4 spaces.
- */
- PrettyWriter& SetIndent(Ch indentChar, unsigned indentCharCount) {
- RAPIDJSON_ASSERT(indentChar == ' ' || indentChar == '\t' || indentChar == '\n' || indentChar == '\r');
- indentChar_ = indentChar;
- indentCharCount_ = indentCharCount;
- return *this;
- }
-
- //@name Implementation of Handler.
- //@{
-
- PrettyWriter& Null() { PrettyPrefix(kNullType); Base::WriteNull(); return *this; }
- PrettyWriter& Bool(bool b) { PrettyPrefix(b ? kTrueType : kFalseType); Base::WriteBool(b); return *this; }
- PrettyWriter& Int(int i) { PrettyPrefix(kNumberType); Base::WriteInt(i); return *this; }
- PrettyWriter& Uint(unsigned u) { PrettyPrefix(kNumberType); Base::WriteUint(u); return *this; }
- PrettyWriter& Int64(int64_t i64) { PrettyPrefix(kNumberType); Base::WriteInt64(i64); return *this; }
- PrettyWriter& Uint64(uint64_t u64) { PrettyPrefix(kNumberType); Base::WriteUint64(u64); return *this; }
- PrettyWriter& Double(double d) { PrettyPrefix(kNumberType); Base::WriteDouble(d); return *this; }
-
- PrettyWriter& String(const Ch* str, SizeType length, bool copy = false) {
- (void)copy;
- PrettyPrefix(kStringType);
- Base::WriteString(str, length);
- return *this;
- }
-
- PrettyWriter& StartObject() {
- PrettyPrefix(kObjectType);
- new (Base::level_stack_.template Push<typename Base::Level>()) typename Base::Level(false);
- Base::WriteStartObject();
- return *this;
- }
-
- PrettyWriter& EndObject(SizeType memberCount = 0) {
- (void)memberCount;
- RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level));
- RAPIDJSON_ASSERT(!Base::level_stack_.template Top<typename Base::Level>()->inArray);
- bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;
-
- if (!empty) {
- Base::stream_.Put('\n');
- WriteIndent();
- }
- Base::WriteEndObject();
- return *this;
- }
-
- PrettyWriter& StartArray() {
- PrettyPrefix(kArrayType);
- new (Base::level_stack_.template Push<typename Base::Level>()) typename Base::Level(true);
- Base::WriteStartArray();
- return *this;
- }
-
- PrettyWriter& EndArray(SizeType memberCount = 0) {
- (void)memberCount;
- RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level));
- RAPIDJSON_ASSERT(Base::level_stack_.template Top<typename Base::Level>()->inArray);
- bool empty = Base::level_stack_.template Pop<typename Base::Level>(1)->valueCount == 0;
-
- if (!empty) {
- Base::stream_.Put('\n');
- WriteIndent();
- }
- Base::WriteEndArray();
- return *this;
- }
-
- //@}
-
- //! Simpler but slower overload.
- PrettyWriter& String(const Ch* str) { return String(str, internal::StrLen(str)); }
-
-protected:
- void PrettyPrefix(Type type) {
- (void)type;
- if (Base::level_stack_.GetSize() != 0) { // this value is not at root
- typename Base::Level* level = Base::level_stack_.template Top<typename Base::Level>();
-
- if (level->inArray) {
- if (level->valueCount > 0) {
- Base::stream_.Put(','); // add comma if it is not the first element in array
- Base::stream_.Put('\n');
- }
- else
- Base::stream_.Put('\n');
- WriteIndent();
- }
- else { // in object
- if (level->valueCount > 0) {
- if (level->valueCount % 2 == 0) {
- Base::stream_.Put(',');
- Base::stream_.Put('\n');
- }
- else {
- Base::stream_.Put(':');
- Base::stream_.Put(' ');
- }
- }
- else
- Base::stream_.Put('\n');
-
- if (level->valueCount % 2 == 0)
- WriteIndent();
- }
- if (!level->inArray && level->valueCount % 2 == 0)
- RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name
- level->valueCount++;
- }
- else
- RAPIDJSON_ASSERT(type == kObjectType || type == kArrayType);
- }
-
- void WriteIndent() {
- size_t count = (Base::level_stack_.GetSize() / sizeof(typename Base::Level)) * indentCharCount_;
- PutN(Base::stream_, indentChar_, count);
- }
-
- Ch indentChar_;
- unsigned indentCharCount_;
-};
-
-} // namespace rapidjson
-
-#endif // RAPIDJSON_RAPIDJSON_H_
diff --git a/include/rapidjson/rapidjson.h b/include/rapidjson/rapidjson.h
deleted file mode 100755
index 7acb2aa4fd..0000000000
--- a/include/rapidjson/rapidjson.h
+++ /dev/null
@@ -1,525 +0,0 @@
-#ifndef RAPIDJSON_RAPIDJSON_H_
-#define RAPIDJSON_RAPIDJSON_H_
-
-// Copyright (c) 2011-2012 Milo Yip (miloyip@gmail.com)
-// Version 0.11
-
-#include <cstdlib> // malloc(), realloc(), free()
-#include <cstring> // memcpy()
-
-///////////////////////////////////////////////////////////////////////////////
-// RAPIDJSON_NO_INT64DEFINE
-
-// Here defines int64_t and uint64_t types in global namespace.
-// If user have their own definition, can define RAPIDJSON_NO_INT64DEFINE to disable this.
-#ifndef RAPIDJSON_NO_INT64DEFINE
-#ifdef _MSC_VER
-typedef __int64 int64_t;
-typedef unsigned __int64 uint64_t;
-#else
-#include <inttypes.h>
-#endif
-#endif // RAPIDJSON_NO_INT64TYPEDEF
-
-///////////////////////////////////////////////////////////////////////////////
-// RAPIDJSON_ENDIAN
-#define RAPIDJSON_LITTLEENDIAN 0 //!< Little endian machine
-#define RAPIDJSON_BIGENDIAN 1 //!< Big endian machine
-
-//! Endianness of the machine.
-/*! GCC provided macro for detecting endianness of the target machine. But other
- compilers may not have this. User can define RAPIDJSON_ENDIAN to either
- RAPIDJSON_LITTLEENDIAN or RAPIDJSON_BIGENDIAN.
-*/
-#ifndef RAPIDJSON_ENDIAN
-#ifdef __BYTE_ORDER__
-#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-#define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN
-#else
-#define RAPIDJSON_ENDIAN RAPIDJSON_BIGENDIAN
-#endif // __BYTE_ORDER__
-#else
-#define RAPIDJSON_ENDIAN RAPIDJSON_LITTLEENDIAN // Assumes little endian otherwise.
-#endif
-#endif // RAPIDJSON_ENDIAN
-
-///////////////////////////////////////////////////////////////////////////////
-// RAPIDJSON_SSE2/RAPIDJSON_SSE42/RAPIDJSON_SIMD
-
-// Enable SSE2 optimization.
-//#define RAPIDJSON_SSE2
-
-// Enable SSE4.2 optimization.
-//#define RAPIDJSON_SSE42
-
-#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42)
-#define RAPIDJSON_SIMD
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-// RAPIDJSON_NO_SIZETYPEDEFINE
-
-#ifndef RAPIDJSON_NO_SIZETYPEDEFINE
-namespace rapidjson {
-//! Use 32-bit array/string indices even for 64-bit platform, instead of using size_t.
-/*! User may override the SizeType by defining RAPIDJSON_NO_SIZETYPEDEFINE.
-*/
-typedef unsigned SizeType;
-} // namespace rapidjson
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-// RAPIDJSON_ASSERT
-
-//! Assertion.
-/*! By default, rapidjson uses C assert() for assertion.
- User can override it by defining RAPIDJSON_ASSERT(x) macro.
-*/
-#ifndef RAPIDJSON_ASSERT
-#include <cassert>
-#define RAPIDJSON_ASSERT(x) assert(x)
-#endif // RAPIDJSON_ASSERT
-
-///////////////////////////////////////////////////////////////////////////////
-// Helpers
-
-#define RAPIDJSON_MULTILINEMACRO_BEGIN do {
-#define RAPIDJSON_MULTILINEMACRO_END \
-} while((void)0, 0)
-
-namespace rapidjson {
-
-///////////////////////////////////////////////////////////////////////////////
-// Allocator
-
-/*! \class rapidjson::Allocator
- \brief Concept for allocating, resizing and freeing memory block.
-
- Note that Malloc() and Realloc() are non-static but Free() is static.
-
- So if an allocator need to support Free(), it needs to put its pointer in
- the header of memory block.
-
-\code
-concept Allocator {
- static const bool kNeedFree; //!< Whether this allocator needs to call Free().
-
- // Allocate a memory block.
- // \param size of the memory block in bytes.
- // \returns pointer to the memory block.
- void* Malloc(size_t size);
-
- // Resize a memory block.
- // \param originalPtr The pointer to current memory block. Null pointer is permitted.
- // \param originalSize The current size in bytes. (Design issue: since some allocator may not book-keep this, explicitly pass to it can save memory.)
- // \param newSize the new size in bytes.
- void* Realloc(void* originalPtr, size_t originalSize, size_t newSize);
-
- // Free a memory block.
- // \param pointer to the memory block. Null pointer is permitted.
- static void Free(void *ptr);
-};
-\endcode
-*/
-
-///////////////////////////////////////////////////////////////////////////////
-// CrtAllocator
-
-//! C-runtime library allocator.
-/*! This class is just wrapper for standard C library memory routines.
- \implements Allocator
-*/
-class CrtAllocator {
-public:
- static const bool kNeedFree = true;
- void* Malloc(size_t size) { return malloc(size); }
- void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) { (void)originalSize; return realloc(originalPtr, newSize); }
- static void Free(void *ptr) { free(ptr); }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// MemoryPoolAllocator
-
-//! Default memory allocator used by the parser and DOM.
-/*! This allocator allocate memory blocks from pre-allocated memory chunks.
-
- It does not free memory blocks. And Realloc() only allocate new memory.
-
- The memory chunks are allocated by BaseAllocator, which is CrtAllocator by default.
-
- User may also supply a buffer as the first chunk.
-
- If the user-buffer is full then additional chunks are allocated by BaseAllocator.
-
- The user-buffer is not deallocated by this allocator.
-
- \tparam BaseAllocator the allocator type for allocating memory chunks. Default is CrtAllocator.
- \implements Allocator
-*/
-template <typename BaseAllocator = CrtAllocator>
-class MemoryPoolAllocator {
-public:
- static const bool kNeedFree = false; //!< Tell users that no need to call Free() with this allocator. (concept Allocator)
-
- //! Constructor with chunkSize.
- /*! \param chunkSize The size of memory chunk. The default is kDefaultChunkSize.
- \param baseAllocator The allocator for allocating memory chunks.
- */
- MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) :
- chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0)
- {
- if (!baseAllocator_)
- ownBaseAllocator_ = baseAllocator_ = new BaseAllocator();
- AddChunk(chunk_capacity_);
- }
-
- //! Constructor with user-supplied buffer.
- /*! The user buffer will be used firstly. When it is full, memory pool allocates new chunk with chunk size.
-
- The user buffer will not be deallocated when this allocator is destructed.
-
- \param buffer User supplied buffer.
- \param size Size of the buffer in bytes. It must at least larger than sizeof(ChunkHeader).
- \param chunkSize The size of memory chunk. The default is kDefaultChunkSize.
- \param baseAllocator The allocator for allocating memory chunks.
- */
- MemoryPoolAllocator(char *buffer, size_t size, size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) :
- chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(buffer), baseAllocator_(baseAllocator), ownBaseAllocator_(0)
- {
- RAPIDJSON_ASSERT(buffer != 0);
- RAPIDJSON_ASSERT(size > sizeof(ChunkHeader));
- chunkHead_ = (ChunkHeader*)buffer;
- chunkHead_->capacity = size - sizeof(ChunkHeader);
- chunkHead_->size = 0;
- chunkHead_->next = 0;
- }
-
- //! Destructor.
- /*! This deallocates all memory chunks, excluding the user-supplied buffer.
- */
- ~MemoryPoolAllocator() {
- Clear();
- delete ownBaseAllocator_;
- }
-
- //! Deallocates all memory chunks, excluding the user-supplied buffer.
- void Clear() {
- while(chunkHead_ != 0 && chunkHead_ != (ChunkHeader *)userBuffer_) {
- ChunkHeader* next = chunkHead_->next;
- baseAllocator_->Free(chunkHead_);
- chunkHead_ = next;
- }
- }
-
- //! Computes the total capacity of allocated memory chunks.
- /*! \return total capacity in bytes.
- */
- size_t Capacity() {
- size_t capacity = 0;
- for (ChunkHeader* c = chunkHead_; c != 0; c = c->next)
- capacity += c->capacity;
- return capacity;
- }
-
- //! Computes the memory blocks allocated.
- /*! \return total used bytes.
- */
- size_t Size() {
- size_t size = 0;
- for (ChunkHeader* c = chunkHead_; c != 0; c = c->next)
- size += c->size;
- return size;
- }
-
- //! Allocates a memory block. (concept Allocator)
- void* Malloc(size_t size) {
- size = (size + 3) & ~3; // Force aligning size to 4
-
- if (chunkHead_->size + size > chunkHead_->capacity)
- AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size);
-
- char *buffer = (char *)(chunkHead_ + 1) + chunkHead_->size;
- RAPIDJSON_ASSERT(((uintptr_t)buffer & 3) == 0); // returned buffer is aligned to 4
- chunkHead_->size += size;
-
- return buffer;
- }
-
- //! Resizes a memory block (concept Allocator)
- void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) {
- if (originalPtr == 0)
- return Malloc(newSize);
-
- // Do not shrink if new size is smaller than original
- if (originalSize >= newSize)
- return originalPtr;
-
- // Simply expand it if it is the last allocation and there is sufficient space
- if (originalPtr == (char *)(chunkHead_ + 1) + chunkHead_->size - originalSize) {
- size_t increment = newSize - originalSize;
- increment = (increment + 3) & ~3; // Force aligning size to 4
- if (chunkHead_->size + increment <= chunkHead_->capacity) {
- chunkHead_->size += increment;
- RAPIDJSON_ASSERT(((uintptr_t)originalPtr & 3) == 0); // returned buffer is aligned to 4
- return originalPtr;
- }
- }
-
- // Realloc process: allocate and copy memory, do not free original buffer.
- void* newBuffer = Malloc(newSize);
- RAPIDJSON_ASSERT(newBuffer != 0); // Do not handle out-of-memory explicitly.
- return memcpy(newBuffer, originalPtr, originalSize);
- }
-
- //! Frees a memory block (concept Allocator)
- static void Free(void *) {} // Do nothing
-
-private:
- //! Creates a new chunk.
- /*! \param capacity Capacity of the chunk in bytes.
- */
- void AddChunk(size_t capacity) {
- ChunkHeader* chunk = (ChunkHeader*)baseAllocator_->Malloc(sizeof(ChunkHeader) + capacity);
- chunk->capacity = capacity;
- chunk->size = 0;
- chunk->next = chunkHead_;
- chunkHead_ = chunk;
- }
-
- static const int kDefaultChunkCapacity = 64 * 1024; //!< Default chunk capacity.
-
- //! Chunk header for perpending to each chunk.
- /*! Chunks are stored as a singly linked list.
- */
- struct ChunkHeader {
- size_t capacity; //!< Capacity of the chunk in bytes (excluding the header itself).
- size_t size; //!< Current size of allocated memory in bytes.
- ChunkHeader *next; //!< Next chunk in the linked list.
- };
-
- ChunkHeader *chunkHead_; //!< Head of the chunk linked-list. Only the head chunk serves allocation.
- size_t chunk_capacity_; //!< The minimum capacity of chunk when they are allocated.
- char *userBuffer_; //!< User supplied buffer.
- BaseAllocator* baseAllocator_; //!< base allocator for allocating memory chunks.
- BaseAllocator* ownBaseAllocator_; //!< base allocator created by this object.
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Encoding
-
-/*! \class rapidjson::Encoding
- \brief Concept for encoding of Unicode characters.
-
-\code
-concept Encoding {
- typename Ch; //! Type of character.
-
- //! \brief Encode a Unicode codepoint to a buffer.
- //! \param buffer pointer to destination buffer to store the result. It should have sufficient size of encoding one character.
- //! \param codepoint An unicode codepoint, ranging from 0x0 to 0x10FFFF inclusively.
- //! \returns the pointer to the next character after the encoded data.
- static Ch* Encode(Ch *buffer, unsigned codepoint);
-};
-\endcode
-*/
-
-///////////////////////////////////////////////////////////////////////////////
-// UTF8
-
-//! UTF-8 encoding.
-/*! http://en.wikipedia.org/wiki/UTF-8
- \tparam CharType Type for storing 8-bit UTF-8 data. Default is char.
- \implements Encoding
-*/
-template<typename CharType = char>
-struct UTF8 {
- typedef CharType Ch;
-
- static Ch* Encode(Ch *buffer, unsigned codepoint) {
- if (codepoint <= 0x7F)
- *buffer++ = codepoint & 0xFF;
- else if (codepoint <= 0x7FF) {
- *buffer++ = 0xC0 | ((codepoint >> 6) & 0xFF);
- *buffer++ = 0x80 | ((codepoint & 0x3F));
- }
- else if (codepoint <= 0xFFFF) {
- *buffer++ = 0xE0 | ((codepoint >> 12) & 0xFF);
- *buffer++ = 0x80 | ((codepoint >> 6) & 0x3F);
- *buffer++ = 0x80 | (codepoint & 0x3F);
- }
- else {
- RAPIDJSON_ASSERT(codepoint <= 0x10FFFF);
- *buffer++ = 0xF0 | ((codepoint >> 18) & 0xFF);
- *buffer++ = 0x80 | ((codepoint >> 12) & 0x3F);
- *buffer++ = 0x80 | ((codepoint >> 6) & 0x3F);
- *buffer++ = 0x80 | (codepoint & 0x3F);
- }
- return buffer;
- }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// UTF16
-
-//! UTF-16 encoding.
-/*! http://en.wikipedia.org/wiki/UTF-16
- \tparam CharType Type for storing 16-bit UTF-16 data. Default is wchar_t. C++11 may use char16_t instead.
- \implements Encoding
-*/
-template<typename CharType = wchar_t>
-struct UTF16 {
- typedef CharType Ch;
-
- static Ch* Encode(Ch* buffer, unsigned codepoint) {
- if (codepoint <= 0xFFFF) {
- RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair
- *buffer++ = static_cast<Ch>(codepoint);
- }
- else {
- RAPIDJSON_ASSERT(codepoint <= 0x10FFFF);
- unsigned v = codepoint - 0x10000;
- *buffer++ = static_cast<Ch>((v >> 10) + 0xD800);
- *buffer++ = (v & 0x3FF) + 0xDC00;
- }
- return buffer;
- }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// UTF32
-
-//! UTF-32 encoding.
-/*! http://en.wikipedia.org/wiki/UTF-32
- \tparam Ch Type for storing 32-bit UTF-32 data. Default is unsigned. C++11 may use char32_t instead.
- \implements Encoding
-*/
-template<typename CharType = unsigned>
-struct UTF32 {
- typedef CharType Ch;
-
- static Ch *Encode(Ch* buffer, unsigned codepoint) {
- RAPIDJSON_ASSERT(codepoint <= 0x10FFFF);
- *buffer++ = codepoint;
- return buffer;
- }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Stream
-
-/*! \class rapidjson::Stream
- \brief Concept for reading and writing characters.
-
- For read-only stream, no need to implement PutBegin(), Put() and PutEnd().
-
- For write-only stream, only need to implement Put().
-
-\code
-concept Stream {
- typename Ch; //!< Character type of the stream.
-
- //! Read the current character from stream without moving the read cursor.
- Ch Peek() const;
-
- //! Read the current character from stream and moving the read cursor to next character.
- Ch Take();
-
- //! Get the current read cursor.
- //! \return Number of characters read from start.
- size_t Tell();
-
- //! Begin writing operation at the current read pointer.
- //! \return The begin writer pointer.
- Ch* PutBegin();
-
- //! Write a character.
- void Put(Ch c);
-
- //! End the writing operation.
- //! \param begin The begin write pointer returned by PutBegin().
- //! \return Number of characters written.
- size_t PutEnd(Ch* begin);
-}
-\endcode
-*/
-
-//! Put N copies of a character to a stream.
-template<typename Stream, typename Ch>
-inline void PutN(Stream& stream, Ch c, size_t n) {
- for (size_t i = 0; i < n; i++)
- stream.Put(c);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// StringStream
-
-//! Read-only string stream.
-/*! \implements Stream
-*/
-template <typename Encoding>
-struct GenericStringStream {
- typedef typename Encoding::Ch Ch;
-
- GenericStringStream(const Ch *src) : src_(src), head_(src) {}
-
- Ch Peek() const { return *src_; }
- Ch Take() { return *src_++; }
- size_t Tell() const { return src_ - head_; }
-
- Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; }
- void Put(Ch) { RAPIDJSON_ASSERT(false); }
- size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; }
-
- const Ch* src_; //!< Current read position.
- const Ch* head_; //!< Original head of the string.
-};
-
-typedef GenericStringStream<UTF8<> > StringStream;
-
-///////////////////////////////////////////////////////////////////////////////
-// InsituStringStream
-
-//! A read-write string stream.
-/*! This string stream is particularly designed for in-situ parsing.
- \implements Stream
-*/
-template <typename Encoding>
-struct GenericInsituStringStream {
- typedef typename Encoding::Ch Ch;
-
- GenericInsituStringStream(Ch *src) : src_(src), dst_(0), head_(src) {}
-
- // Read
- Ch Peek() { return *src_; }
- Ch Take() { return *src_++; }
- size_t Tell() { return src_ - head_; }
-
- // Write
- Ch* PutBegin() { return dst_ = src_; }
- void Put(Ch c) { RAPIDJSON_ASSERT(dst_ != 0); *dst_++ = c; }
- size_t PutEnd(Ch* begin) { return dst_ - begin; }
-
- Ch* src_;
- Ch* dst_;
- Ch* head_;
-};
-
-typedef GenericInsituStringStream<UTF8<> > InsituStringStream;
-
-///////////////////////////////////////////////////////////////////////////////
-// Type
-
-//! Type of JSON value
-enum Type {
- kNullType = 0, //!< null
- kFalseType = 1, //!< false
- kTrueType = 2, //!< true
- kObjectType = 3, //!< object
- kArrayType = 4, //!< array
- kStringType = 5, //!< string
- kNumberType = 6, //!< number
-};
-
-} // namespace rapidjson
-
-#endif // RAPIDJSON_RAPIDJSON_H_
diff --git a/include/rapidjson/reader.h b/include/rapidjson/reader.h
deleted file mode 100755
index 16d672633b..0000000000
--- a/include/rapidjson/reader.h
+++ /dev/null
@@ -1,692 +0,0 @@
-#ifndef RAPIDJSON_READER_H_
-#define RAPIDJSON_READER_H_
-
-// Copyright (c) 2011 Milo Yip (miloyip@gmail.com)
-// Version 0.1
-
-#include "rapidjson.h"
-#include "internal/pow10.h"
-#include "internal/stack.h"
-#include <csetjmp>
-
-#ifdef RAPIDJSON_SSE42
-#include <nmmintrin.h>
-#elif defined(RAPIDJSON_SSE2)
-#include <emmintrin.h>
-#endif
-
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable : 4127) // conditional expression is constant
-#endif
-
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
-#endif
-
-#ifndef RAPIDJSON_PARSE_ERROR
-#define RAPIDJSON_PARSE_ERROR(msg, offset) \
- RAPIDJSON_MULTILINEMACRO_BEGIN \
- parseError_ = msg; \
- errorOffset_ = offset; \
- longjmp(jmpbuf_, 1); \
- RAPIDJSON_MULTILINEMACRO_END
-#endif
-
-namespace rapidjson {
-
-///////////////////////////////////////////////////////////////////////////////
-// ParseFlag
-
-//! Combination of parseFlags
-enum ParseFlag {
- kParseDefaultFlags = 0, //!< Default parse flags. Non-destructive parsing. Text strings are decoded into allocated buffer.
- kParseInsituFlag = 1 //!< In-situ(destructive) parsing.
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Handler
-
-/*! \class rapidjson::Handler
- \brief Concept for receiving events from GenericReader upon parsing.
-\code
-concept Handler {
- typename Ch;
-
- void Null();
- void Bool(bool b);
- void Int(int i);
- void Uint(unsigned i);
- void Int64(int64_t i);
- void Uint64(uint64_t i);
- void Double(double d);
- void String(const Ch* str, SizeType length, bool copy);
- void StartObject();
- void EndObject(SizeType memberCount);
- void StartArray();
- void EndArray(SizeType elementCount);
-};
-\endcode
-*/
-///////////////////////////////////////////////////////////////////////////////
-// BaseReaderHandler
-
-//! Default implementation of Handler.
-/*! This can be used as base class of any reader handler.
- \implements Handler
-*/
-template<typename Encoding = UTF8<> >
-struct BaseReaderHandler {
- typedef typename Encoding::Ch Ch;
-
- void Default() {}
- void Null() { Default(); }
- void Bool(bool) { Default(); }
- void Int(int) { Default(); }
- void Uint(unsigned) { Default(); }
- void Int64(int64_t) { Default(); }
- void Uint64(uint64_t) { Default(); }
- void Double(double) { Default(); }
- void String(const Ch*, SizeType, bool) { Default(); }
- void StartObject() { Default(); }
- void EndObject(SizeType) { Default(); }
- void StartArray() { Default(); }
- void EndArray(SizeType) { Default(); }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// SkipWhitespace
-
-//! Skip the JSON white spaces in a stream.
-/*! \param stream A input stream for skipping white spaces.
- \note This function has SSE2/SSE4.2 specialization.
-*/
-template<typename Stream>
-void SkipWhitespace(Stream& stream) {
- Stream s = stream; // Use a local copy for optimization
- while (s.Peek() == ' ' || s.Peek() == '\n' || s.Peek() == '\r' || s.Peek() == '\t')
- s.Take();
- stream = s;
-}
-
-#ifdef RAPIDJSON_SSE42
-//! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once.
-inline const char *SkipWhitespace_SIMD(const char* p) {
- static const char whitespace[16] = " \n\r\t";
- __m128i w = _mm_loadu_si128((const __m128i *)&whitespace[0]);
-
- for (;;) {
- __m128i s = _mm_loadu_si128((const __m128i *)p);
- unsigned r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY));
- if (r == 0) // all 16 characters are whitespace
- p += 16;
- else { // some of characters may be non-whitespace
-#ifdef _MSC_VER // Find the index of first non-whitespace
- unsigned long offset;
- if (_BitScanForward(&offset, r))
- return p + offset;
-#else
- if (r != 0)
- return p + __builtin_ffs(r) - 1;
-#endif
- }
- }
-}
-
-#elif defined(RAPIDJSON_SSE2)
-
-//! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once.
-inline const char *SkipWhitespace_SIMD(const char* p) {
- static const char whitespaces[4][17] = {
- " ",
- "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",
- "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r",
- "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"};
-
- __m128i w0 = _mm_loadu_si128((const __m128i *)&whitespaces[0][0]);
- __m128i w1 = _mm_loadu_si128((const __m128i *)&whitespaces[1][0]);
- __m128i w2 = _mm_loadu_si128((const __m128i *)&whitespaces[2][0]);
- __m128i w3 = _mm_loadu_si128((const __m128i *)&whitespaces[3][0]);
-
- for (;;) {
- __m128i s = _mm_loadu_si128((const __m128i *)p);
- __m128i x = _mm_cmpeq_epi8(s, w0);
- x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));
- x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));
- x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));
- unsigned short r = ~_mm_movemask_epi8(x);
- if (r == 0) // all 16 characters are whitespace
- p += 16;
- else { // some of characters may be non-whitespace
-#ifdef _MSC_VER // Find the index of first non-whitespace
- unsigned long offset;
- if (_BitScanForward(&offset, r))
- return p + offset;
-#else
- if (r != 0)
- return p + __builtin_ffs(r) - 1;
-#endif
- }
- }
-}
-
-#endif // RAPIDJSON_SSE2
-
-#ifdef RAPIDJSON_SIMD
-//! Template function specialization for InsituStringStream
-template<> inline void SkipWhitespace(InsituStringStream& stream) {
- stream.src_ = const_cast<char*>(SkipWhitespace_SIMD(stream.src_));
-}
-
-//! Template function specialization for StringStream
-template<> inline void SkipWhitespace(StringStream& stream) {
- stream.src_ = SkipWhitespace_SIMD(stream.src_);
-}
-#endif // RAPIDJSON_SIMD
-
-///////////////////////////////////////////////////////////////////////////////
-// GenericReader
-
-//! SAX-style JSON parser. Use Reader for UTF8 encoding and default allocator.
-/*! GenericReader parses JSON text from a stream, and send events synchronously to an
- object implementing Handler concept.
-
- It needs to allocate a stack for storing a single decoded string during
- non-destructive parsing.
-
- For in-situ parsing, the decoded string is directly written to the source
- text string, no temporary buffer is required.
-
- A GenericReader object can be reused for parsing multiple JSON text.
-
- \tparam Encoding Encoding of both the stream and the parse output.
- \tparam Allocator Allocator type for stack.
-*/
-template <typename Encoding, typename Allocator = MemoryPoolAllocator<> >
-class GenericReader {
-public:
- typedef typename Encoding::Ch Ch;
-
- //! Constructor.
- /*! \param allocator Optional allocator for allocating stack memory. (Only use for non-destructive parsing)
- \param stackCapacity stack capacity in bytes for storing a single decoded string. (Only use for non-destructive parsing)
- */
- GenericReader(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity) : stack_(allocator, stackCapacity), parseError_(0), errorOffset_(0) {}
-
- //! Parse JSON text.
- /*! \tparam parseFlags Combination of ParseFlag.
- \tparam Stream Type of input stream.
- \tparam Handler Type of handler which must implement Handler concept.
- \param stream Input stream to be parsed.
- \param handler The handler to receive events.
- \return Whether the parsing is successful.
- */
- template <unsigned parseFlags, typename Stream, typename Handler>
- bool Parse(Stream& stream, Handler& handler) {
- parseError_ = 0;
- errorOffset_ = 0;
-
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable : 4611) // interaction between '_setjmp' and C++ object destruction is non-portable
-#endif
- if (setjmp(jmpbuf_)) {
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
- stack_.Clear();
- return false;
- }
-
- SkipWhitespace(stream);
-
- if (stream.Peek() == '\0')
- RAPIDJSON_PARSE_ERROR("Text only contains white space(s)", stream.Tell());
- else {
- switch (stream.Peek()) {
- case '{': ParseObject<parseFlags>(stream, handler); break;
- case '[': ParseArray<parseFlags>(stream, handler); break;
- default: RAPIDJSON_PARSE_ERROR("Expect either an object or array at root", stream.Tell());
- }
- SkipWhitespace(stream);
-
- if (stream.Peek() != '\0')
- RAPIDJSON_PARSE_ERROR("Nothing should follow the root object or array.", stream.Tell());
- }
-
- return true;
- }
-
- bool HasParseError() const { return parseError_ != 0; }
- const char* GetParseError() const { return parseError_; }
- size_t GetErrorOffset() const { return errorOffset_; }
-
-private:
- // Parse object: { string : value, ... }
- template<unsigned parseFlags, typename Stream, typename Handler>
- void ParseObject(Stream& stream, Handler& handler) {
- RAPIDJSON_ASSERT(stream.Peek() == '{');
- stream.Take(); // Skip '{'
- handler.StartObject();
- SkipWhitespace(stream);
-
- if (stream.Peek() == '}') {
- stream.Take();
- handler.EndObject(0); // empty object
- return;
- }
-
- for (SizeType memberCount = 0;;) {
- if (stream.Peek() != '"') {
- RAPIDJSON_PARSE_ERROR("Name of an object member must be a string", stream.Tell());
- break;
- }
-
- ParseString<parseFlags>(stream, handler);
- SkipWhitespace(stream);
-
- if (stream.Take() != ':') {
- RAPIDJSON_PARSE_ERROR("There must be a colon after the name of object member", stream.Tell());
- break;
- }
- SkipWhitespace(stream);
-
- ParseValue<parseFlags>(stream, handler);
- SkipWhitespace(stream);
-
- ++memberCount;
-
- switch(stream.Take()) {
- case ',': SkipWhitespace(stream); break;
- case '}': handler.EndObject(memberCount); return;
- default: RAPIDJSON_PARSE_ERROR("Must be a comma or '}' after an object member", stream.Tell());
- }
- }
- }
-
- // Parse array: [ value, ... ]
- template<unsigned parseFlags, typename Stream, typename Handler>
- void ParseArray(Stream& stream, Handler& handler) {
- RAPIDJSON_ASSERT(stream.Peek() == '[');
- stream.Take(); // Skip '['
- handler.StartArray();
- SkipWhitespace(stream);
-
- if (stream.Peek() == ']') {
- stream.Take();
- handler.EndArray(0); // empty array
- return;
- }
-
- for (SizeType elementCount = 0;;) {
- ParseValue<parseFlags>(stream, handler);
- ++elementCount;
- SkipWhitespace(stream);
-
- switch (stream.Take()) {
- case ',': SkipWhitespace(stream); break;
- case ']': handler.EndArray(elementCount); return;
- default: RAPIDJSON_PARSE_ERROR("Must be a comma or ']' after an array element.", stream.Tell());
- }
- }
- }
-
- template<unsigned parseFlags, typename Stream, typename Handler>
- void ParseNull(Stream& stream, Handler& handler) {
- RAPIDJSON_ASSERT(stream.Peek() == 'n');
- stream.Take();
-
- if (stream.Take() == 'u' && stream.Take() == 'l' && stream.Take() == 'l')
- handler.Null();
- else
- RAPIDJSON_PARSE_ERROR("Invalid value", stream.Tell() - 1);
- }
-
- template<unsigned parseFlags, typename Stream, typename Handler>
- void ParseTrue(Stream& stream, Handler& handler) {
- RAPIDJSON_ASSERT(stream.Peek() == 't');
- stream.Take();
-
- if (stream.Take() == 'r' && stream.Take() == 'u' && stream.Take() == 'e')
- handler.Bool(true);
- else
- RAPIDJSON_PARSE_ERROR("Invalid value", stream.Tell());
- }
-
- template<unsigned parseFlags, typename Stream, typename Handler>
- void ParseFalse(Stream& stream, Handler& handler) {
- RAPIDJSON_ASSERT(stream.Peek() == 'f');
- stream.Take();
-
- if (stream.Take() == 'a' && stream.Take() == 'l' && stream.Take() == 's' && stream.Take() == 'e')
- handler.Bool(false);
- else
- RAPIDJSON_PARSE_ERROR("Invalid value", stream.Tell() - 1);
- }
-
- // Helper function to parse four hexidecimal digits in \uXXXX in ParseString().
- template<typename Stream>
- unsigned ParseHex4(Stream& stream) {
- Stream s = stream; // Use a local copy for optimization
- unsigned codepoint = 0;
- for (int i = 0; i < 4; i++) {
- Ch c = s.Take();
- codepoint <<= 4;
- codepoint += c;
- if (c >= '0' && c <= '9')
- codepoint -= '0';
- else if (c >= 'A' && c <= 'F')
- codepoint -= 'A' - 10;
- else if (c >= 'a' && c <= 'f')
- codepoint -= 'a' - 10;
- else
- RAPIDJSON_PARSE_ERROR("Incorrect hex digit after \\u escape", s.Tell() - 1);
- }
- stream = s; // Restore stream
- return codepoint;
- }
-
- // Parse string, handling the prefix and suffix double quotes and escaping.
- template<unsigned parseFlags, typename Stream, typename Handler>
- void ParseString(Stream& stream, Handler& handler) {
-#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- static const Ch escape[256] = {
- Z16, Z16, 0, 0,'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'/',
- Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0,
- 0, 0,'\b', 0, 0, 0,'\f', 0, 0, 0, 0, 0, 0, 0,'\n', 0,
- 0, 0,'\r', 0,'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
- };
-#undef Z16
-
- Stream s = stream; // Use a local copy for optimization
- RAPIDJSON_ASSERT(s.Peek() == '\"');
- s.Take(); // Skip '\"'
- Ch *head;
- SizeType len;
- if (parseFlags & kParseInsituFlag)
- head = s.PutBegin();
- else
- len = 0;
-
-#define RAPIDJSON_PUT(x) \
- do { \
- if (parseFlags & kParseInsituFlag) \
- s.Put(x); \
- else { \
- *stack_.template Push<Ch>() = x; \
- ++len; \
- } \
- } while(false)
-
- for (;;) {
- Ch c = s.Take();
- if (c == '\\') { // Escape
- Ch e = s.Take();
- if ((sizeof(Ch) == 1 || e < 256) && escape[(unsigned char)e])
- RAPIDJSON_PUT(escape[(unsigned char)e]);
- else if (e == 'u') { // Unicode
- unsigned codepoint = ParseHex4(s);
- if (codepoint >= 0xD800 && codepoint <= 0xDBFF) { // Handle UTF-16 surrogate pair
- if (s.Take() != '\\' || s.Take() != 'u') {
- RAPIDJSON_PARSE_ERROR("Missing the second \\u in surrogate pair", s.Tell() - 2);
- return;
- }
- unsigned codepoint2 = ParseHex4(s);
- if (codepoint2 < 0xDC00 || codepoint2 > 0xDFFF) {
- RAPIDJSON_PARSE_ERROR("The second \\u in surrogate pair is invalid", s.Tell() - 2);
- return;
- }
- codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
- }
-
- Ch buffer[4];
- SizeType count = SizeType(Encoding::Encode(buffer, codepoint) - &buffer[0]);
-
- if (parseFlags & kParseInsituFlag)
- for (SizeType i = 0; i < count; i++)
- s.Put(buffer[i]);
- else {
- memcpy(stack_.template Push<Ch>(count), buffer, count * sizeof(Ch));
- len += count;
- }
- }
- else {
- RAPIDJSON_PARSE_ERROR("Unknown escape character", stream.Tell() - 1);
- return;
- }
- }
- else if (c == '"') { // Closing double quote
- if (parseFlags & kParseInsituFlag) {
- size_t length = s.PutEnd(head);
- RAPIDJSON_ASSERT(length <= 0xFFFFFFFF);
- RAPIDJSON_PUT('\0'); // null-terminate the string
- handler.String(head, SizeType(length), false);
- }
- else {
- RAPIDJSON_PUT('\0');
- handler.String(stack_.template Pop<Ch>(len), len - 1, true);
- }
- stream = s; // restore stream
- return;
- }
- else if (c == '\0') {
- RAPIDJSON_PARSE_ERROR("lacks ending quotation before the end of string", stream.Tell() - 1);
- return;
- }
- else if ((unsigned)c < 0x20) { // RFC 4627: unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
- RAPIDJSON_PARSE_ERROR("Incorrect unescaped character in string", stream.Tell() - 1);
- return;
- }
- else
- RAPIDJSON_PUT(c); // Normal character, just copy
- }
-#undef RAPIDJSON_PUT
- }
-
- template<unsigned parseFlags, typename Stream, typename Handler>
- void ParseNumber(Stream& stream, Handler& handler) {
- Stream s = stream; // Local copy for optimization
- // Parse minus
- bool minus = false;
- if (s.Peek() == '-') {
- minus = true;
- s.Take();
- }
-
- // Parse int: zero / ( digit1-9 *DIGIT )
- unsigned i;
- bool try64bit = false;
- if (s.Peek() == '0') {
- i = 0;
- s.Take();
- }
- else if (s.Peek() >= '1' && s.Peek() <= '9') {
- i = s.Take() - '0';
-
- if (minus)
- while (s.Peek() >= '0' && s.Peek() <= '9') {
- if (i >= 214748364) { // 2^31 = 2147483648
- if (i != 214748364 || s.Peek() > '8') {
- try64bit = true;
- break;
- }
- }
- i = i * 10 + (s.Take() - '0');
- }
- else
- while (s.Peek() >= '0' && s.Peek() <= '9') {
- if (i >= 429496729) { // 2^32 - 1 = 4294967295
- if (i != 429496729 || s.Peek() > '5') {
- try64bit = true;
- break;
- }
- }
- i = i * 10 + (s.Take() - '0');
- }
- }
- else {
- RAPIDJSON_PARSE_ERROR("Expect a value here.", stream.Tell());
- return;
- }
-
- // Parse 64bit int
- uint64_t i64 = 0;
- bool useDouble = false;
- if (try64bit) {
- i64 = i;
- if (minus)
- while (s.Peek() >= '0' && s.Peek() <= '9') {
- if (i64 >= 922337203685477580uLL) // 2^63 = 9223372036854775808
- if (i64 != 922337203685477580uLL || s.Peek() > '8') {
- useDouble = true;
- break;
- }
- i64 = i64 * 10 + (s.Take() - '0');
- }
- else
- while (s.Peek() >= '0' && s.Peek() <= '9') {
- if (i64 >= 1844674407370955161uLL) // 2^64 - 1 = 18446744073709551615
- if (i64 != 1844674407370955161uLL || s.Peek() > '5') {
- useDouble = true;
- break;
- }
- i64 = i64 * 10 + (s.Take() - '0');
- }
- }
-
- // Force double for big integer
- double d = 0.0;
- if (useDouble) {
- d = (double)i64;
- while (s.Peek() >= '0' && s.Peek() <= '9') {
- if (d >= 1E307) {
- RAPIDJSON_PARSE_ERROR("Number too big to store in double", stream.Tell());
- return;
- }
- d = d * 10 + (s.Take() - '0');
- }
- }
-
- // Parse frac = decimal-point 1*DIGIT
- int expFrac = 0;
- if (s.Peek() == '.') {
- if (!useDouble) {
- d = try64bit ? (double)i64 : (double)i;
- useDouble = true;
- }
- s.Take();
-
- if (s.Peek() >= '0' && s.Peek() <= '9') {
- d = d * 10 + (s.Take() - '0');
- --expFrac;
- }
- else {
- RAPIDJSON_PARSE_ERROR("At least one digit in fraction part", stream.Tell());
- return;
- }
-
- while (s.Peek() >= '0' && s.Peek() <= '9') {
- if (expFrac > -16) {
- d = d * 10 + (s.Peek() - '0');
- --expFrac;
- }
- s.Take();
- }
- }
-
- // Parse exp = e [ minus / plus ] 1*DIGIT
- int exp = 0;
- if (s.Peek() == 'e' || s.Peek() == 'E') {
- if (!useDouble) {
- d = try64bit ? (double)i64 : (double)i;
- useDouble = true;
- }
- s.Take();
-
- bool expMinus = false;
- if (s.Peek() == '+')
- s.Take();
- else if (s.Peek() == '-') {
- s.Take();
- expMinus = true;
- }
-
- if (s.Peek() >= '0' && s.Peek() <= '9') {
- exp = s.Take() - '0';
- while (s.Peek() >= '0' && s.Peek() <= '9') {
- exp = exp * 10 + (s.Take() - '0');
- if (exp > 308) {
- RAPIDJSON_PARSE_ERROR("Number too big to store in double", stream.Tell());
- return;
- }
- }
- }
- else {
- RAPIDJSON_PARSE_ERROR("At least one digit in exponent", s.Tell());
- return;
- }
-
- if (expMinus)
- exp = -exp;
- }
-
- // Finish parsing, call event according to the type of number.
- if (useDouble) {
- d *= internal::Pow10(exp + expFrac);
- handler.Double(minus ? -d : d);
- }
- else {
- if (try64bit) {
- if (minus)
- handler.Int64(-(int64_t)i64);
- else
- handler.Uint64(i64);
- }
- else {
- if (minus)
- handler.Int(-(int)i);
- else
- handler.Uint(i);
- }
- }
-
- stream = s; // restore stream
- }
-
- // Parse any JSON value
- template<unsigned parseFlags, typename Stream, typename Handler>
- void ParseValue(Stream& stream, Handler& handler) {
- switch (stream.Peek()) {
- case 'n': ParseNull <parseFlags>(stream, handler); break;
- case 't': ParseTrue <parseFlags>(stream, handler); break;
- case 'f': ParseFalse <parseFlags>(stream, handler); break;
- case '"': ParseString<parseFlags>(stream, handler); break;
- case '{': ParseObject<parseFlags>(stream, handler); break;
- case '[': ParseArray <parseFlags>(stream, handler); break;
- default : ParseNumber<parseFlags>(stream, handler);
- }
- }
-
- static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string.
- internal::Stack<Allocator> stack_; //!< A stack for storing decoded string temporarily during non-destructive parsing.
- jmp_buf jmpbuf_; //!< setjmp buffer for fast exit from nested parsing function calls.
- const char* parseError_;
- size_t errorOffset_;
-}; // class GenericReader
-
-//! Reader with UTF8 encoding and default allocator.
-typedef GenericReader<UTF8<> > Reader;
-
-} // namespace rapidjson
-
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
-#endif // RAPIDJSON_READER_H_
diff --git a/include/rapidjson/stringbuffer.h b/include/rapidjson/stringbuffer.h
deleted file mode 100755
index 269ae10761..0000000000
--- a/include/rapidjson/stringbuffer.h
+++ /dev/null
@@ -1,49 +0,0 @@
-#ifndef RAPIDJSON_STRINGBUFFER_H_
-#define RAPIDJSON_STRINGBUFFER_H_
-
-#include "rapidjson.h"
-#include "internal/stack.h"
-
-namespace rapidjson {
-
-//! Represents an in-memory output stream.
-/*!
- \tparam Encoding Encoding of the stream.
- \tparam Allocator type for allocating memory buffer.
- \implements Stream
-*/
-template <typename Encoding, typename Allocator = CrtAllocator>
-struct GenericStringBuffer {
- typedef typename Encoding::Ch Ch;
-
- GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity) : stack_(allocator, capacity) {}
-
- void Put(Ch c) { *stack_.template Push<Ch>() = c; }
-
- void Clear() { stack_.Clear(); }
-
- const char* GetString() const {
- // Push and pop a null terminator. This is safe.
- *stack_.template Push<Ch>() = '\0';
- stack_.template Pop<Ch>(1);
-
- return stack_.template Bottom<Ch>();
- }
-
- size_t Size() const { return stack_.GetSize(); }
-
- static const size_t kDefaultCapacity = 256;
- mutable internal::Stack<Allocator> stack_;
-};
-
-typedef GenericStringBuffer<UTF8<> > StringBuffer;
-
-//! Implement specialized version of PutN() with memset() for better performance.
-template<>
-inline void PutN(GenericStringBuffer<UTF8<> >& stream, char c, size_t n) {
- memset(stream.stack_.Push<char>(n), c, n * sizeof(c));
-}
-
-} // namespace rapidjson
-
-#endif // RAPIDJSON_STRINGBUFFER_H_
diff --git a/include/rapidjson/writer.h b/include/rapidjson/writer.h
deleted file mode 100755
index d96f2081a9..0000000000
--- a/include/rapidjson/writer.h
+++ /dev/null
@@ -1,241 +0,0 @@
-#ifndef RAPIDJSON_WRITER_H_
-#define RAPIDJSON_WRITER_H_
-
-#include "rapidjson.h"
-#include "internal/stack.h"
-#include "internal/strfunc.h"
-#include <cstdio> // snprintf() or _sprintf_s()
-#include <new> // placement new
-
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable : 4127) // conditional expression is constant
-#endif
-
-namespace rapidjson {
-
-//! JSON writer
-/*! Writer implements the concept Handler.
- It generates JSON text by events to an output stream.
-
- User may programmatically calls the functions of a writer to generate JSON text.
-
- On the other side, a writer can also be passed to objects that generates events,
-
- for example Reader::Parse() and Document::Accept().
-
- \tparam Stream Type of ouptut stream.
- \tparam Encoding Encoding of both source strings and output.
- \implements Handler
-*/
-template<typename Stream, typename Encoding = UTF8<>, typename Allocator = MemoryPoolAllocator<> >
-class Writer {
-public:
- typedef typename Encoding::Ch Ch;
-
- Writer(Stream& stream, Allocator* allocator = 0, size_t levelDepth = kDefaultLevelDepth) :
- stream_(stream), level_stack_(allocator, levelDepth * sizeof(Level)) {}
-
- //@name Implementation of Handler
- //@{
- Writer& Null() { Prefix(kNullType); WriteNull(); return *this; }
- Writer& Bool(bool b) { Prefix(b ? kTrueType : kFalseType); WriteBool(b); return *this; }
- Writer& Int(int i) { Prefix(kNumberType); WriteInt(i); return *this; }
- Writer& Uint(unsigned u) { Prefix(kNumberType); WriteUint(u); return *this; }
- Writer& Int64(int64_t i64) { Prefix(kNumberType); WriteInt64(i64); return *this; }
- Writer& Uint64(uint64_t u64) { Prefix(kNumberType); WriteUint64(u64); return *this; }
- Writer& Double(double d) { Prefix(kNumberType); WriteDouble(d); return *this; }
-
- Writer& String(const Ch* str, SizeType length, bool copy = false) {
- (void)copy;
- Prefix(kStringType);
- WriteString(str, length);
- return *this;
- }
-
- Writer& StartObject() {
- Prefix(kObjectType);
- new (level_stack_.template Push<Level>()) Level(false);
- WriteStartObject();
- return *this;
- }
-
- Writer& EndObject(SizeType memberCount = 0) {
- (void)memberCount;
- RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level));
- RAPIDJSON_ASSERT(!level_stack_.template Top<Level>()->inArray);
- level_stack_.template Pop<Level>(1);
- WriteEndObject();
- return *this;
- }
-
- Writer& StartArray() {
- Prefix(kArrayType);
- new (level_stack_.template Push<Level>()) Level(true);
- WriteStartArray();
- return *this;
- }
-
- Writer& EndArray(SizeType elementCount = 0) {
- (void)elementCount;
- RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level));
- RAPIDJSON_ASSERT(level_stack_.template Top<Level>()->inArray);
- level_stack_.template Pop<Level>(1);
- WriteEndArray();
- return *this;
- }
- //@}
-
- //! Simpler but slower overload.
- Writer& String(const Ch* str) { return String(str, internal::StrLen(str)); }
-
-protected:
- //! Information for each nested level
- struct Level {
- Level(bool inArray_) : inArray(inArray_), valueCount(0) {}
- bool inArray; //!< true if in array, otherwise in object
- size_t valueCount; //!< number of values in this level
- };
-
- static const size_t kDefaultLevelDepth = 32;
-
- void WriteNull() {
- stream_.Put('n'); stream_.Put('u'); stream_.Put('l'); stream_.Put('l');
- }
-
- void WriteBool(bool b) {
- if (b) {
- stream_.Put('t'); stream_.Put('r'); stream_.Put('u'); stream_.Put('e');
- }
- else {
- stream_.Put('f'); stream_.Put('a'); stream_.Put('l'); stream_.Put('s'); stream_.Put('e');
- }
- }
-
- void WriteInt(int i) {
- if (i < 0) {
- stream_.Put('-');
- i = -i;
- }
- WriteUint((unsigned)i);
- }
-
- void WriteUint(unsigned u) {
- char buffer[10];
- char *p = buffer;
- do {
- *p++ = (u % 10) + '0';
- u /= 10;
- } while (u > 0);
-
- do {
- --p;
- stream_.Put(*p);
- } while (p != buffer);
- }
-
- void WriteInt64(int64_t i64) {
- if (i64 < 0) {
- stream_.Put('-');
- i64 = -i64;
- }
- WriteUint64((uint64_t)i64);
- }
-
- void WriteUint64(uint64_t u64) {
- char buffer[20];
- char *p = buffer;
- do {
- *p++ = char(u64 % 10) + '0';
- u64 /= 10;
- } while (u64 > 0);
-
- do {
- --p;
- stream_.Put(*p);
- } while (p != buffer);
- }
-
- //! \todo Optimization with custom double-to-string converter.
- void WriteDouble(double d) {
- char buffer[100];
-#if _MSC_VER
- int ret = sprintf_s(buffer, sizeof(buffer), "%g", d);
-#else
- int ret = snprintf(buffer, sizeof(buffer), "%g", d);
-#endif
- RAPIDJSON_ASSERT(ret >= 1);
- for (int i = 0; i < ret; i++)
- stream_.Put(buffer[i]);
- }
-
- void WriteString(const Ch* str, SizeType length) {
- static const char hexDigits[] = "0123456789ABCDEF";
- static const char escape[256] = {
-#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- //0 1 2 3 4 5 6 7 8 9 A B C D E F
- 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'b', 't', 'n', 'u', 'f', 'r', 'u', 'u', // 00
- 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', // 10
- 0, 0, '"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20
- Z16, Z16, // 30~4F
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'\\', 0, 0, 0, // 50
- Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16 // 60~FF
-#undef Z16
- };
-
- stream_.Put('\"');
- for (const Ch* p = str; p != str + length; ++p) {
- if ((sizeof(Ch) == 1 || *p < 256) && escape[(unsigned char)*p]) {
- stream_.Put('\\');
- stream_.Put(escape[(unsigned char)*p]);
- if (escape[(unsigned char)*p] == 'u') {
- stream_.Put('0');
- stream_.Put('0');
- stream_.Put(hexDigits[(*p) >> 4]);
- stream_.Put(hexDigits[(*p) & 0xF]);
- }
- }
- else
- stream_.Put(*p);
- }
- stream_.Put('\"');
- }
-
- void WriteStartObject() { stream_.Put('{'); }
- void WriteEndObject() { stream_.Put('}'); }
- void WriteStartArray() { stream_.Put('['); }
- void WriteEndArray() { stream_.Put(']'); }
-
- void Prefix(Type type) {
- (void)type;
- if (level_stack_.GetSize() != 0) { // this value is not at root
- Level* level = level_stack_.template Top<Level>();
- if (level->valueCount > 0) {
- if (level->inArray)
- stream_.Put(','); // add comma if it is not the first element in array
- else // in object
- stream_.Put((level->valueCount % 2 == 0) ? ',' : ':');
- }
- if (!level->inArray && level->valueCount % 2 == 0)
- RAPIDJSON_ASSERT(type == kStringType); // if it's in object, then even number should be a name
- level->valueCount++;
- }
- else
- RAPIDJSON_ASSERT(type == kObjectType || type == kArrayType);
- }
-
- Stream& stream_;
- internal::Stack<Allocator> level_stack_;
-
-private:
- // Prohibit assignment for VC C4512 warning
- Writer& operator=(const Writer& w);
-};
-
-} // namespace rapidjson
-
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
-
-#endif // RAPIDJSON_RAPIDJSON_H_