summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2016-10-28 14:55:07 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2016-10-28 17:10:45 -0700
commita4c82b8a3b5e48f3bbccf32be80d45ca78d51515 (patch)
treedc5576c815a49fd310e6c599f87eac64d3f99e7d
parentee3235708f5422c2737c41fca948c67ace598f4b (diff)
downloadqtlocation-mapboxgl-a4c82b8a3b5e48f3bbccf32be80d45ca78d51515.tar.gz
[core] operator bool() must always be explicit
Otherwise, it can participate in unexpected conversions. Case in point: GlyphSet::insert was comparing the result of GlyphMetrics::operator bool() where it wanted to use operator==.
-rw-r--r--include/mbgl/util/size.hpp2
-rw-r--r--src/mbgl/text/glyph.hpp14
-rw-r--r--src/mbgl/text/shaping.hpp2
3 files changed, 13 insertions, 5 deletions
diff --git a/include/mbgl/util/size.hpp b/include/mbgl/util/size.hpp
index c0e2fd8180..1af85bcff5 100644
--- a/include/mbgl/util/size.hpp
+++ b/include/mbgl/util/size.hpp
@@ -13,7 +13,7 @@ public:
constexpr Size(const uint32_t width_, const uint32_t height_) : width(width_), height(height_) {
}
- constexpr operator bool() const {
+ constexpr explicit operator bool() const {
return width > 0 && height > 0;
}
diff --git a/src/mbgl/text/glyph.hpp b/src/mbgl/text/glyph.hpp
index 975dc4ad23..a333f68ff4 100644
--- a/src/mbgl/text/glyph.hpp
+++ b/src/mbgl/text/glyph.hpp
@@ -14,7 +14,7 @@ namespace mbgl {
GlyphRange getGlyphRange(char32_t glyph);
struct GlyphMetrics {
- operator bool() const {
+ explicit operator bool() const {
return !(width == 0 && height == 0 && advance == 0);
}
@@ -27,12 +27,20 @@ struct GlyphMetrics {
};
+inline bool operator==(const GlyphMetrics& lhs, const GlyphMetrics& rhs) {
+ return lhs.width == rhs.width &&
+ lhs.height == rhs.height &&
+ lhs.left == rhs.left &&
+ lhs.top == rhs.top &&
+ lhs.advance == rhs.advance;
+}
+
struct Glyph {
explicit Glyph() : rect(0, 0, 0, 0), metrics() {}
explicit Glyph(Rect<uint16_t> rect_, GlyphMetrics metrics_)
: rect(std::move(rect_)), metrics(std::move(metrics_)) {}
- operator bool() const {
+ explicit operator bool() const {
return metrics || rect.hasArea();
}
@@ -64,7 +72,7 @@ class Shaping {
int32_t left;
int32_t right;
- operator bool() const { return !positionedGlyphs.empty(); }
+ explicit operator bool() const { return !positionedGlyphs.empty(); }
};
class SDFGlyph {
diff --git a/src/mbgl/text/shaping.hpp b/src/mbgl/text/shaping.hpp
index cd5e8105fd..7852f710f1 100644
--- a/src/mbgl/text/shaping.hpp
+++ b/src/mbgl/text/shaping.hpp
@@ -26,7 +26,7 @@ class PositionedIcon {
float left = 0;
float right = 0;
- operator bool() const { return image && (*image).pos.hasArea(); }
+ explicit operator bool() const { return image && (*image).pos.hasArea(); }
};
PositionedIcon shapeIcon(const SpriteAtlasElement& image, const style::SymbolLayoutProperties&);