compile fix for MSVC 2008 and std::upper_bound
authorThomas Hartmann <Thomas.Hartmann@digia.com>
Tue, 2 Oct 2012 14:50:01 +0000 (16:50 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Thu, 4 Oct 2012 09:58:48 +0000 (11:58 +0200)
qUpperBound was replaced by std::upper_bound.

Unfortunately the STL of MSVC 2008 enforces
the definition of the operator in both
directions.

Change-Id: I3e0f775c23e43332d106e0847d3611e488da6c06
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
src/gui/text/qtextdocumentlayout.cpp
src/gui/text/qtextengine.cpp
src/widgets/widgets/qwidgettextcontrol.cpp

index 15177dd..9b77c9c 100644 (file)
@@ -401,6 +401,26 @@ Q_STATIC_GLOBAL_OPERATOR bool operator<(const QCheckPoint &checkPoint, int pos)
     return checkPoint.positionInFrame < pos;
 }
 
+#if defined(Q_CC_MSVC) && _MSC_VER < 1600
+//The STL implementation of MSVC 2008 requires the definitions
+
+Q_STATIC_GLOBAL_OPERATOR bool operator<(const QCheckPoint &checkPoint2, const QCheckPoint &checkPoint1)
+{
+    return checkPoint1.y < checkPoint2.y;
+}
+
+Q_STATIC_GLOBAL_OPERATOR bool operator<(QFixed y, const QCheckPoint &checkPoint)
+{
+    return y < checkPoint.y;
+}
+
+Q_STATIC_GLOBAL_OPERATOR bool operator<(int pos, const QCheckPoint &checkPoint)
+{
+    return pos < checkPoint.positionInFrame;
+}
+
+#endif
+
 static void fillBackground(QPainter *p, const QRectF &rect, QBrush brush, const QPointF &origin, QRectF gradientRect = QRectF())
 {
     p->save();
index 0c90589..8527a85 100644 (file)
@@ -2540,7 +2540,10 @@ namespace {
 struct QScriptItemComparator {
     bool operator()(const QScriptItem &a, const QScriptItem &b) { return a.position < b.position; }
     bool operator()(int p, const QScriptItem &b) { return p < b.position; }
-    //bool operator()(const QScriptItem &a, int p) { return a.position < p; }
+#if defined(Q_CC_MSVC) && _MSC_VER < 1600
+//The STL implementation of MSVC 2008 requires the definition
+    bool operator()(const QScriptItem &a, int p) { return a.position < p; }
+#endif
 };
 }
 
index ec3663e..a2e8230 100644 (file)
@@ -1408,14 +1408,15 @@ QRectF QWidgetTextControlPrivate::rectForPosition(int position) const
     return r;
 }
 
-static inline bool firstFramePosLessThanCursorPos(QTextFrame *frame, int position)
-{
-    return frame->firstPosition() < position;
-}
-
-static inline bool cursorPosLessThanLastFramePos(int position, QTextFrame *frame)
-{
-    return position < frame->lastPosition();
+namespace {
+struct QTextFrameComparator {
+#if defined(Q_CC_MSVC) && _MSC_VER < 1600
+//The STL implementation of MSVC 2008 requires the definition
+    bool operator()(QTextFrame *frame1, QTextFrame *frame2) { return frame1->firstPosition() < frame2->firstPosition(); }
+#endif
+    bool operator()(QTextFrame *frame, int position) { return frame->firstPosition() < position; }
+    bool operator()(int position, QTextFrame *frame) { return position < frame->firstPosition(); }
+};
 }
 
 static QRectF boundingRectOfFloatsInSelection(const QTextCursor &cursor)
@@ -1425,9 +1426,9 @@ static QRectF boundingRectOfFloatsInSelection(const QTextCursor &cursor)
     const QList<QTextFrame *> children = frame->childFrames();
 
     const QList<QTextFrame *>::ConstIterator firstFrame = std::lower_bound(children.constBegin(), children.constEnd(),
-                                                                           cursor.selectionStart(), firstFramePosLessThanCursorPos);
+                                                                           cursor.selectionStart(), QTextFrameComparator());
     const QList<QTextFrame *>::ConstIterator lastFrame = std::upper_bound(children.constBegin(), children.constEnd(),
-                                                                          cursor.selectionEnd(), cursorPosLessThanLastFramePos);
+                                                                          cursor.selectionEnd(), QTextFrameComparator());
     for (QList<QTextFrame *>::ConstIterator it = firstFrame; it != lastFrame; ++it) {
         if ((*it)->frameFormat().position() != QTextFrameFormat::InFlow)
             r |= frame->document()->documentLayout()->frameBoundingRect(*it);