diff --git a/share/qtcreator/debugger/boosttypes.py b/share/qtcreator/debugger/boosttypes.py
new file mode 100644
index 0000000000000000000000000000000000000000..7720f8401d38dd0290ccd34015f2fa89303b3175
--- /dev/null
+++ b/share/qtcreator/debugger/boosttypes.py
@@ -0,0 +1,109 @@
+############################################################################
+#
+# Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+# Contact: http://www.qt-project.org/legal
+#
+# This file is part of Qt Creator.
+#
+# Commercial License Usage
+# Licensees holding valid commercial Qt licenses may use this file in
+# accordance with the commercial license agreement provided with the
+# Software or, alternatively, in accordance with the terms contained in
+# a written agreement between you and Digia.  For licensing terms and
+# conditions see http://qt.digia.com/licensing.  For further information
+# use the contact form at http://qt.digia.com/contact-us.
+#
+# GNU Lesser General Public License Usage
+# Alternatively, this file may be used under the terms of the GNU Lesser
+# General Public License version 2.1 as published by the Free Software
+# Foundation and appearing in the file LICENSE.LGPL included in the
+# packaging of this file.  Please review the following information to
+# ensure the GNU Lesser General Public License version 2.1 requirements
+# will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+#
+# In addition, as a special exception, Digia gives you certain additional
+# rights.  These rights are described in the Digia Qt LGPL Exception
+# version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+#
+#############################################################################
+
+from dumper import *
+
+def qdump__boost__bimaps__bimap(d, value):
+    #leftType = d.templateArgument(value.type, 0)
+    #rightType = d.templateArgument(value.type, 1)
+    size = int(value["core"]["node_count"])
+    d.putItemCount(size)
+    d.putNumChild(size)
+    if d.isExpanded():
+        d.putPlainChildren(value)
+
+
+def qdump__boost__optional(d, value):
+    if int(value["m_initialized"]) == 0:
+        d.putValue("<uninitialized>")
+        d.putNumChild(0)
+    else:
+        type = d.templateArgument(value.type, 0)
+        storage = value["m_storage"]
+        if d.isReferenceType(type):
+            d.putItem(storage.cast(type.target().pointer()).dereference())
+        else:
+            d.putItem(storage.cast(type))
+        d.putBetterType(value.type)
+
+
+def qdump__boost__shared_ptr(d, value):
+    # s                  boost::shared_ptr<int>
+    #    pn              boost::detail::shared_count
+    #        pi_ 0x0     boost::detail::sp_counted_base *
+    #    px      0x0     int *
+    if d.isNull(value["pn"]["pi_"]):
+        d.putValue("(null)")
+        d.putNumChild(0)
+        return
+
+    if d.isNull(value["px"]):
+        d.putValue("(null)")
+        d.putNumChild(0)
+        return
+
+    countedbase = value["pn"]["pi_"].dereference()
+    weakcount = int(countedbase["weak_count_"])
+    usecount = int(countedbase["use_count_"])
+    d.check(weakcount >= 0)
+    d.check(weakcount <= int(usecount))
+    d.check(usecount <= 10*1000*1000)
+
+    val = value["px"].dereference()
+    if d.isSimpleType(val.type):
+        d.putNumChild(3)
+        d.putItem(val)
+        d.putBetterType(value.type)
+    else:
+        d.putEmptyValue()
+
+    d.putNumChild(3)
+    if d.isExpanded():
+        with Children(d, 3):
+            d.putSubItem("data", val)
+            d.putIntItem("weakcount", weakcount)
+            d.putIntItem("usecount", usecount)
+
+
+def qdump__boost__gregorian__date(d, value):
+    d.putValue(int(value["days_"]), JulianDate)
+    d.putNumChild(0)
+
+
+def qdump__boost__posix_time__ptime(d, item):
+    ms = int(item["time_"]["time_count_"]["value_"]) / 1000
+    d.putValue("%s/%s" % divmod(ms, 86400000), JulianDateAndMillisecondsSinceMidnight)
+    d.putNumChild(0)
+
+
+def qdump__boost__posix_time__time_duration(d, item):
+    d.putValue(int(item["ticks_"]["value_"]) / 1000, MillisecondsSinceMidnight)
+    d.putNumChild(0)
+
+
diff --git a/share/qtcreator/debugger/creatortypes.py b/share/qtcreator/debugger/creatortypes.py
new file mode 100644
index 0000000000000000000000000000000000000000..2b25e2240ffb0723a6a58c63af734dac9de23002
--- /dev/null
+++ b/share/qtcreator/debugger/creatortypes.py
@@ -0,0 +1,127 @@
+############################################################################
+#
+# Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+# Contact: http://www.qt-project.org/legal
+#
+# This file is part of Qt Creator.
+#
+# Commercial License Usage
+# Licensees holding valid commercial Qt licenses may use this file in
+# accordance with the commercial license agreement provided with the
+# Software or, alternatively, in accordance with the terms contained in
+# a written agreement between you and Digia.  For licensing terms and
+# conditions see http://qt.digia.com/licensing.  For further information
+# use the contact form at http://qt.digia.com/contact-us.
+#
+# GNU Lesser General Public License Usage
+# Alternatively, this file may be used under the terms of the GNU Lesser
+# General Public License version 2.1 as published by the Free Software
+# Foundation and appearing in the file LICENSE.LGPL included in the
+# packaging of this file.  Please review the following information to
+# ensure the GNU Lesser General Public License version 2.1 requirements
+# will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+#
+# In addition, as a special exception, Digia gives you certain additional
+# rights.  These rights are described in the Digia Qt LGPL Exception
+# version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+#
+#############################################################################
+
+from dumper import *
+
+def qdump__Core__Id(d, value):
+    try:
+        name = parseAndEvaluate("Core::nameForId(%d)" % value["m_id"])
+        d.putValue(encodeCharArray(name), Hex2EncodedLatin1)
+        d.putPlainChildren(value)
+    except:
+        d.putValue(value["m_id"])
+        d.putNumChild(0)
+
+def qdump__Debugger__Internal__GdbMi(d, value):
+    str = d.encodeByteArray(value["m_name"]) + "3a20" \
+        + d.encodeByteArray(value["m_data"])
+    d.putValue(str, Hex2EncodedLatin1)
+    d.putPlainChildren(value)
+
+def qdump__Debugger__Internal__WatchData(d, value):
+    d.putByteArrayValue(value["iname"])
+    d.putPlainChildren(value)
+
+def qdump__Debugger__Internal__WatchItem(d, value):
+    d.putByteArrayValue(value["iname"])
+    d.putPlainChildren(value)
+
+def qdump__Debugger__Internal__BreakpointModelId(d, value):
+    d.putValue("%s.%s" % (value["m_majorPart"], value["m_minorPart"]))
+    d.putPlainChildren(value)
+
+def qdump__CPlusPlus__ByteArrayRef(d, value):
+    d.putValue(encodeCharArray(value["m_start"], 100, value["m_length"]),
+        Hex2EncodedLatin1)
+    d.putPlainChildren(value)
+
+def qdump__CPlusPlus__Identifier(d, value):
+    d.putValue(encodeCharArray(value["_chars"]), Hex2EncodedLatin1)
+    d.putPlainChildren(value)
+
+def qdump__CPlusPlus__IntegerType(d, value):
+    d.putValue(value["_kind"])
+    d.putPlainChildren(value)
+
+def qdump__CPlusPlus__NamedType(d, value):
+    literal = downcast(value["_name"])
+    d.putValue(encodeCharArray(literal["_chars"]), Hex2EncodedLatin1)
+    d.putPlainChildren(value)
+
+def qdump__CPlusPlus__TemplateNameId(d, value):
+    s = encodeCharArray(value["_identifier"]["_chars"])
+    d.putValue(s + "3c2e2e2e3e", Hex2EncodedLatin1)
+    d.putPlainChildren(value)
+
+def qdump__CPlusPlus__Literal(d, value):
+    d.putValue(encodeCharArray(value["_chars"]), Hex2EncodedLatin1)
+    d.putPlainChildren(value)
+
+def qdump__CPlusPlus__StringLiteral(d, value):
+    d.putValue(encodeCharArray(value["_chars"]), Hex2EncodedLatin1)
+    d.putPlainChildren(value)
+
+def qdump__CPlusPlus__Internal__Value(d, value):
+    d.putValue(value["l"])
+    d.putPlainChildren(value)
+
+def qdump__Utils__FileName(d, value):
+    d.putStringValue(value)
+    d.putPlainChildren(value)
+
+def qdump__Utils__ElfSection(d, value):
+    d.putByteArrayValue(value["name"])
+    d.putPlainChildren(value)
+
+def qdump__CPlusPlus__Token(d, value):
+    k = int(value["f"]["kind"])
+    if int(k) == 6:
+        d.putValue("T_IDENTIFIER. offset: %d, len: %d"
+            % (value["offset"], value["f"]["length"]))
+    elif int(k) == 7:
+        d.putValue("T_NUMERIC_LITERAL. offset: %d, value: %d"
+            % (value["offset"], value["f"]["length"]))
+    elif int(k) == 60:
+        d.putValue("T_RPAREN")
+    else:
+        d.putValue("Type: %s" % k)
+    d.putPlainChildren(value)
+
+def qdump__CPlusPlus__Internal__PPToken(d, value):
+    k = value["f"]["kind"];
+    data, size, alloc = d.byteArrayData(value["m_src"])
+    length = int(value["f"]["length"])
+    offset = int(value["offset"])
+    #warn("size: %s, alloc: %s, offset: %s, length: %s, data: %s"
+    #    % (size, alloc, offset, length, data))
+    d.putValue(d.readMemory(data + offset, min(100, length)),
+        Hex2EncodedLatin1)
+    d.putPlainChildren(value)
+
+
diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py
index 09c989b717b10b57d6197b04474ea9ed26c3b73e..5ddd82f53c597cd73ed4b659781b73eb144ef9ed 100644
--- a/share/qtcreator/debugger/gdbbridge.py
+++ b/share/qtcreator/debugger/gdbbridge.py
@@ -23,6 +23,10 @@ def warn(message):
 
 from dumper import *
 from qttypes import *
+from stdtypes import *
+from misctypes import *
+from boosttypes import *
+
 
 #######################################################################
 #
diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py
index 0b1e5ec51285e2db7dea0ed6a2706cc704843b16..5c52241bdc6dd7ea038ac516423732620815e16a 100644
--- a/share/qtcreator/debugger/lldbbridge.py
+++ b/share/qtcreator/debugger/lldbbridge.py
@@ -41,6 +41,9 @@ sys.path.insert(1, currentDir)
 
 from dumper import *
 from qttypes import *
+from stdtypes import *
+from misctypes import *
+from boosttypes import *
 
 
 
diff --git a/share/qtcreator/debugger/misctypes.py b/share/qtcreator/debugger/misctypes.py
new file mode 100644
index 0000000000000000000000000000000000000000..11515d9dd827819c7c4345ca5278ad5149453c76
--- /dev/null
+++ b/share/qtcreator/debugger/misctypes.py
@@ -0,0 +1,316 @@
+############################################################################
+#
+# Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+# Contact: http://www.qt-project.org/legal
+#
+# This file is part of Qt Creator.
+#
+# Commercial License Usage
+# Licensees holding valid commercial Qt licenses may use this file in
+# accordance with the commercial license agreement provided with the
+# Software or, alternatively, in accordance with the terms contained in
+# a written agreement between you and Digia.  For licensing terms and
+# conditions see http://qt.digia.com/licensing.  For further information
+# use the contact form at http://qt.digia.com/contact-us.
+#
+# GNU Lesser General Public License Usage
+# Alternatively, this file may be used under the terms of the GNU Lesser
+# General Public License version 2.1 as published by the Free Software
+# Foundation and appearing in the file LICENSE.LGPL included in the
+# packaging of this file.  Please review the following information to
+# ensure the GNU Lesser General Public License version 2.1 requirements
+# will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+#
+# In addition, as a special exception, Digia gives you certain additional
+# rights.  These rights are described in the Digia Qt LGPL Exception
+# version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+#
+#############################################################################
+
+from dumper import *
+
+#######################################################################
+#
+# SSE
+#
+#######################################################################
+
+def qform____m128():
+    return "As Floats,As Doubles"
+
+def qdump____m128(d, value):
+    d.putEmptyValue()
+    d.putNumChild(1)
+    if d.isExpanded():
+        format = d.currentItemFormat()
+        if format == 2: # As Double
+            d.putArrayData(d.lookupType("double"), value.address, 2)
+        else: # Default, As float
+            d.putArrayData(d.lookupType("float"), value.address, 4)
+
+
+#######################################################################
+#
+# Eigen
+#
+#######################################################################
+
+#def qform__Eigen__Matrix():
+#    return "Transposed"
+
+def qdump__Eigen__Matrix(d, value):
+    innerType = d.templateArgument(value.type, 0)
+    storage = value["m_storage"]
+    options = d.numericTemplateArgument(value.type, 3)
+    rowMajor = (int(options) & 0x1)
+    argRow = d.numericTemplateArgument(value.type, 1)
+    argCol = d.numericTemplateArgument(value.type, 2)
+    nrows = value["m_storage"]["m_rows"] if argRow == -1 else int(argRow)
+    ncols = value["m_storage"]["m_cols"] if argCol == -1 else int(argCol)
+    p = storage["m_data"]
+    if d.isStructType(p.type): # Static
+        p = p["array"].cast(innerType.pointer())
+    d.putValue("(%s x %s), %s" % (nrows, ncols, ["ColumnMajor", "RowMajor"][rowMajor]))
+    d.putField("keeporder", "1")
+    d.putNumChild(nrows * ncols)
+
+    limit = 10000
+    nncols = min(ncols, limit)
+    nnrows = min(nrows, limit * limit / nncols)
+    if d.isExpanded():
+        #format = d.currentItemFormat() # format == 1 is "Transposed"
+        with Children(d, nrows * ncols, childType=innerType):
+            if ncols == 1 or nrows == 1:
+                for i in range(0, min(nrows * ncols, 10000)):
+                    d.putSubItem(i, (p + i).dereference())
+            elif rowMajor == 1:
+                s = 0
+                for i in range(0, nnrows):
+                    for j in range(0, nncols):
+                        v = (p + i * ncols + j).dereference()
+                        d.putNamedSubItem(s, v, "[%d,%d]" % (i, j))
+                        s = s + 1
+            else:
+                s = 0
+                for j in range(0, nncols):
+                    for i in range(0, nnrows):
+                        v = (p + i + j * nrows).dereference()
+                        d.putNamedSubItem(s, v, "[%d,%d]" % (i, j))
+                        s = s + 1
+
+
+#######################################################################
+#
+# D
+#
+#######################################################################
+
+def cleanDType(type):
+    return d.stripClassTag(str(type)).replace("uns long long", "string")
+
+def qdump_Array(d, value):
+    n = value["length"]
+    p = value["ptr"]
+    t = cleanDType(value.type)[7:]
+    d.putType("%s[%d]" % (t, n))
+    if t == "char":
+        d.putValue(encodeCharArray(p, 100), Hex2EncodedLocal8Bit)
+        d.putNumChild(0)
+    else:
+        d.putEmptyValue()
+        d.putNumChild(n)
+        innerType = p.type
+        if d.isExpanded():
+            with Children(d, n, childType=innerType):
+                for i in range(0, n):
+                    d.putSubItem(i, p.dereference())
+                    p = p + 1
+
+
+def qdump_AArray(d, value):
+    #n = value["length"]
+    # This ends up as _AArray_<key>_<value> with a single .ptr
+    # member of type void *. Not much that can be done here.
+    p = value["ptr"]
+    t = cleanDType(value.type)[8:]
+    d.putType("%s]" % t.replace("_", "["))
+    d.putEmptyValue()
+    d.putNumChild(1)
+    if d.isExpanded():
+        with Children(d, 1):
+                d.putSubItem("ptr", p)
+
+
+#######################################################################
+#
+# Display Test
+#
+#######################################################################
+
+if False:
+
+    # FIXME: Make that work
+    def qdump__Color(d, value):
+        v = value
+        d.putValue("(%s, %s, %s; %s)" % (v["r"], v["g"], v["b"], v["a"]))
+        d.putPlainChildren(value)
+
+    def qdump__Color_(d, value):
+        v = value
+        d.putValue("(%s, %s, %s; %s)" % (v["r"], v["g"], v["b"], v["a"]))
+        if d.isExpanded():
+            with Children(d):
+                with SubItem(d, "0"):
+                    d.putItem(v["r"])
+                with SubItem(d, "1"):
+                    d.putItem(v["g"])
+                with SubItem(d, "2"):
+                    d.putItem(v["b"])
+                with SubItem(d, "3"):
+                    d.putItem(v["a"])
+
+
+if False:
+
+    def qform__basic__Function():
+        return "Normal,Displayed"
+
+    def qdump__basic__Function(d, value):
+        min = value["min"]
+        max = value["max"]
+        data, size, alloc = d.byteArrayData(value["var"])
+        var = extractCString(data, 0)
+        data, size, alloc = d.byteArrayData(value["f"])
+        f = extractCString(data, 0)
+        d.putValue("%s, %s=%f..%f" % (f, var, min, max))
+        d.putNumChild(0)
+        format = d.currentItemFormat()
+        if format == 1:
+            d.putDisplay(StopDisplay)
+        elif format == 2:
+            input = "plot [%s=%f:%f] %s" % (var, min, max, f)
+            d.putDisplay(DisplayProcess, input, "gnuplot")
+
+
+if False:
+
+    def qdump__tree_entry(d, value):
+        d.putValue("len: %s, offset: %s, type: %s" %
+            (value["blocklength"], value["offset"], value["type"]))
+        d.putNumChild(0)
+
+    def qdump__tree(d, value):
+        count = value["count"]
+        entries = value["entries"]
+        base = value["base"].cast(d.charPtrType())
+        d.putItemCount(count)
+        d.putNumChild(count)
+        if d.isExpanded():
+          with Children(d):
+            with SubItem(d, "tree"):
+              d.putEmptyValue()
+              d.putNoType()
+              d.putNumChild(1)
+              if d.isExpanded():
+                with Children(d):
+                  for i in xrange(count):
+                      d.putSubItem(Item(entries[i], iname))
+            with SubItem(d, "data"):
+              d.putEmptyValue()
+              d.putNoType()
+              d.putNumChild(1)
+              if d.isExpanded():
+                 with Children(d):
+                    for i in xrange(count):
+                      with SubItem(d, i):
+                        entry = entries[i]
+                        mpitype = str(entry["type"])
+                        d.putType(mpitype)
+                        length = int(entry["blocklength"])
+                        offset = int(entry["offset"])
+                        d.putValue("%s items at %s" % (length, offset))
+                        if mpitype == "MPI_INT":
+                          innerType = "int"
+                        elif mpitype == "MPI_CHAR":
+                          innerType = "char"
+                        elif mpitype == "MPI_DOUBLE":
+                          innerType = "double"
+                        else:
+                          length = 0
+                        d.putNumChild(length)
+                        if d.isExpanded():
+                           with Children(d):
+                              t = d.lookupType(innerType).pointer()
+                              p = (base + offset).cast(t)
+                              for j in range(length):
+                                d.putSubItem(j, p.dereference())
+
+    #struct KRBase
+    #{
+    #    enum Type { TYPE_A, TYPE_B } type;
+    #    KRBase(Type _type) : type(_type) {}
+    #};
+    #
+    #struct KRA : KRBase { int x; int y; KRA():KRBase(TYPE_A),x(1),y(32) {} };
+    #struct KRB : KRBase { KRB():KRBase(TYPE_B) {}  };
+    #
+    #void testKR()
+    #{
+    #    KRBase *ptr1 = new KRA;
+    #    KRBase *ptr2 = new KRB;
+    #    ptr2 = new KRB;
+    #}
+
+    def qdump__KRBase(d, value):
+        if getattr(value, "__nested__", None) is None:
+            base = ["KRA", "KRB"][int(value["type"])]
+            nest = value.cast(d.lookupType(base))
+            nest.__nested__ = True
+            warn("NEST %s " % dir(nest))
+            d.putItem(nest)
+        else:
+            d.putName("type")
+            d.putValue(value["type"])
+            d.putNoType()
+
+
+
+if False:
+    def qdump__bug5106__A5106(d, value):
+        d.putName("a")
+        d.putValue("This is the value: %s" % value["m_a"])
+        d.putNoType()
+        d.putNumChild(0)
+
+
+if False:
+    def qdump__bug6933__Base(d, value):
+        d.putValue("foo")
+        d.putPlainChildren(value)
+
+if False:
+    def qdump__gdb13393__Base(d, value):
+        d.putValue("Base (%s)" % value["a"])
+        d.putType(value.type)
+        d.putPlainChildren(value)
+
+    def qdump__gdb13393__Derived(d, value):
+        d.putValue("Derived (%s, %s)" % (value["a"], value["b"]))
+        d.putType(value.type)
+        d.putPlainChildren(value)
+
+
+def qdump__KDSoapValue1(d, value):
+    inner = value["d"]["d"].dereference()
+    d.putStringValue(inner["m_name"])
+    if d.isExpanded():
+        with Children(d):
+            d.putFields(inner)
+
+def qdump__KDSoapValue(d, value):
+    p = (value.cast(lookupType("char*")) + 4).dereference().cast(lookupType("QString"))
+    d.putStringValue(p)
+    if d.isExpanded():
+        with Children(d):
+            data = value["d"]["d"].dereference()
+            d.putFields(data)
diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py
index a08c893def4c57769dc7a63938ab3d3457c8aa87..11ec7104ae848fcb484e9fa424b2fb89a433ed7c 100644
--- a/share/qtcreator/debugger/qttypes.py
+++ b/share/qtcreator/debugger/qttypes.py
@@ -1,11 +1,32 @@
-
-#######################################################################
+############################################################################
 #
-# Dumper Implementations
+# Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+# Contact: http://www.qt-project.org/legal
 #
-#######################################################################
+# This file is part of Qt Creator.
+#
+# Commercial License Usage
+# Licensees holding valid commercial Qt licenses may use this file in
+# accordance with the commercial license agreement provided with the
+# Software or, alternatively, in accordance with the terms contained in
+# a written agreement between you and Digia.  For licensing terms and
+# conditions see http://qt.digia.com/licensing.  For further information
+# use the contact form at http://qt.digia.com/contact-us.
+#
+# GNU Lesser General Public License Usage
+# Alternatively, this file may be used under the terms of the GNU Lesser
+# General Public License version 2.1 as published by the Free Software
+# Foundation and appearing in the file LICENSE.LGPL included in the
+# packaging of this file.  Please review the following information to
+# ensure the GNU Lesser General Public License version 2.1 requirements
+# will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+#
+# In addition, as a special exception, Digia gives you certain additional
+# rights.  These rights are described in the Digia Qt LGPL Exception
+# version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+#
+#############################################################################
 
-from __future__ import with_statement
 from dumper import *
 
 
@@ -1948,710 +1969,6 @@ def qdump__QxXmlAttributes(d, value):
     pass
 
 
-#######################################################################
-#
-# Standard Library dumper
-#
-#######################################################################
-
-def qdump____c_style_array__(d, value):
-    type = value.type.unqualified()
-    targetType = value[0].type
-    #d.putAddress(value.address)
-    d.putType(type)
-    d.putNumChild(1)
-    format = d.currentItemFormat()
-    isDefault = format == None and str(targetType.unqualified()) == "char"
-    if isDefault or format == 0 or format == 1 or format == 2:
-        blob = d.readMemory(value.address, type.sizeof)
-
-    if isDefault:
-        # Use Latin1 as default for char [].
-        d.putValue(blob, Hex2EncodedLatin1)
-    elif format == 0:
-        # Explicitly requested Latin1 formatting.
-        d.putValue(blob, Hex2EncodedLatin1)
-    elif format == 1:
-        # Explicitly requested UTF-8 formatting.
-        d.putValue(blob, Hex2EncodedUtf8)
-    elif format == 2:
-        # Explicitly requested Local 8-bit formatting.
-        d.putValue(blob, Hex2EncodedLocal8Bit)
-    else:
-        d.putValue("@0x%x" % d.pointerValue(value.cast(targetType.pointer())))
-
-    if d.currentIName in d.expandedINames:
-        p = value.address
-        ts = targetType.sizeof
-        if not d.tryPutArrayContents(targetType, p, int(type.sizeof / ts)):
-            with Children(d, childType=targetType,
-                    addrBase=p, addrStep=ts):
-                d.putFields(value)
-
-
-def qdump__std__array(d, value):
-    size = d.numericTemplateArgument(value.type, 1)
-    d.putItemCount(size)
-    d.putNumChild(size)
-    if d.isExpanded():
-        innerType = d.templateArgument(value.type, 0)
-        d.putArrayData(innerType, d.addressOf(value), size)
-
-
-def qdump__std____1__array(d, value):
-    qdump__std__array(d, value)
-
-
-def qdump__std__complex(d, value):
-    innerType = d.templateArgument(value.type, 0)
-    base = value.address.cast(innerType.pointer())
-    real = base.dereference()
-    imag = (base + 1).dereference()
-    d.putValue("(%f, %f)" % (real, imag));
-    d.putNumChild(2)
-    if d.isExpanded():
-        with Children(d, 2, childType=innerType):
-            d.putSubItem("real", real)
-            d.putSubItem("imag", imag)
-
-
-def qdump__std__deque(d, value):
-    innerType = d.templateArgument(value.type, 0)
-    innerSize = innerType.sizeof
-    bufsize = 1
-    if innerSize < 512:
-        bufsize = int(512 / innerSize)
-
-    impl = value["_M_impl"]
-    start = impl["_M_start"]
-    finish = impl["_M_finish"]
-    size = bufsize * toInteger(finish["_M_node"] - start["_M_node"] - 1)
-    size += toInteger(finish["_M_cur"] - finish["_M_first"])
-    size += toInteger(start["_M_last"] - start["_M_cur"])
-
-    d.check(0 <= size and size <= 1000 * 1000 * 1000)
-    d.putItemCount(size)
-    d.putNumChild(size)
-    if d.isExpanded():
-        with Children(d, size, maxNumChild=2000, childType=innerType):
-            pcur = start["_M_cur"]
-            pfirst = start["_M_first"]
-            plast = start["_M_last"]
-            pnode = start["_M_node"]
-            for i in d.childRange():
-                d.putSubItem(i, pcur.dereference())
-                pcur += 1
-                if pcur == plast:
-                    newnode = pnode + 1
-                    pnode = newnode
-                    pfirst = newnode.dereference()
-                    plast = pfirst + bufsize
-                    pcur = pfirst
-
-def qdump__std____debug__deque(d, value):
-    qdump__std__deque(d, value)
-
-
-def qdump__std__list(d, value):
-    head = d.dereferenceValue(value)
-    impl = value["_M_impl"]
-    node = impl["_M_node"]
-    size = 0
-    pp = d.dereference(head)
-    while head != pp and size <= 1001:
-        size += 1
-        pp = d.dereference(pp)
-
-    d.putItemCount(size, 1000)
-    d.putNumChild(size)
-
-    if d.isExpanded():
-        p = node["_M_next"]
-        innerType = d.templateArgument(value.type, 0)
-        with Children(d, size, maxNumChild=1000, childType=innerType):
-            for i in d.childRange():
-                innerPointer = innerType.pointer()
-                d.putSubItem(i, (p + 1).cast(innerPointer).dereference())
-                p = p["_M_next"]
-
-def qdump__std____debug__list(d, value):
-    qdump__std__list(d, value)
-
-def qform__std__map():
-    return mapForms()
-
-def qdump__std__map(d, value):
-    impl = value["_M_t"]["_M_impl"]
-    size = int(impl["_M_node_count"])
-    d.check(0 <= size and size <= 100*1000*1000)
-    d.putItemCount(size)
-    d.putNumChild(size)
-
-    if d.isExpanded():
-        keyType = d.templateArgument(value.type, 0)
-        valueType = d.templateArgument(value.type, 1)
-        try:
-            # Does not work on gcc 4.4, the allocator type (fourth template
-            # argument) seems not to be available.
-            pairType = d.templateArgument(d.templateArgument(value.type, 3), 0)
-            pairPointer = pairType.pointer()
-        except:
-            # So use this as workaround:
-            pairType = d.templateArgument(impl.type, 1)
-            pairPointer = pairType.pointer()
-        isCompact = d.isMapCompact(keyType, valueType)
-        innerType = pairType
-        if isCompact:
-            innerType = valueType
-        node = impl["_M_header"]["_M_left"]
-        childType = innerType
-        if size == 0:
-            childType = pairType
-        childNumChild = 2
-        if isCompact:
-            childNumChild = None
-        with Children(d, size, maxNumChild=1000,
-                childType=childType, childNumChild=childNumChild):
-            for i in d.childRange():
-                with SubItem(d, i):
-                    pair = (node + 1).cast(pairPointer).dereference()
-                    if isCompact:
-                        d.putMapName(pair["first"])
-                        d.putItem(pair["second"])
-                    else:
-                        d.putEmptyValue()
-                        if d.isExpanded():
-                            with Children(d, 2):
-                                d.putSubItem("first", pair["first"])
-                                d.putSubItem("second", pair["second"])
-                if d.isNull(node["_M_right"]):
-                    parent = node["_M_parent"]
-                    while node == parent["_M_right"]:
-                        node = parent
-                        parent = parent["_M_parent"]
-                    if node["_M_right"] != parent:
-                        node = parent
-                else:
-                    node = node["_M_right"]
-                    while not d.isNull(node["_M_left"]):
-                        node = node["_M_left"]
-
-def qdump__std____debug__map(d, value):
-    qdump__std__map(d, value)
-
-def qdump__std____debug__set(d, value):
-    qdump__std__set(d, value)
-
-def qdump__std____cxx1998__map(d, value):
-    qdump__std__map(d, value)
-
-def stdTreeIteratorHelper(d, value):
-    pnode = value["_M_node"]
-    node = pnode.dereference()
-    d.putNumChild(1)
-    d.putEmptyValue()
-    if d.isExpanded():
-        dataType = d.templateArgument(value.type, 0)
-        nodeType = d.lookupType("std::_Rb_tree_node<%s>" % dataType)
-        data = pnode.cast(nodeType.pointer()).dereference()["_M_value_field"]
-        with Children(d):
-            try:
-                d.putSubItem("first", data["first"])
-                d.putSubItem("second", data["second"])
-            except:
-                d.putSubItem("value", data)
-            with SubItem(d, "node"):
-                d.putNumChild(1)
-                d.putEmptyValue()
-                d.putType(" ")
-                if d.isExpanded():
-                    with Children(d):
-                        d.putSubItem("color", node["_M_color"])
-                        d.putSubItem("left", node["_M_left"])
-                        d.putSubItem("right", node["_M_right"])
-                        d.putSubItem("parent", node["_M_parent"])
-
-
-def qdump__std___Rb_tree_iterator(d, value):
-    stdTreeIteratorHelper(d, value)
-
-def qdump__std___Rb_tree_const_iterator(d, value):
-    stdTreeIteratorHelper(d, value)
-
-def qdump__std__map__iterator(d, value):
-    stdTreeIteratorHelper(d, value)
-
-def qdump____gnu_debug___Safe_iterator(d, value):
-    d.putItem(value["_M_current"])
-
-def qdump__std__map__const_iterator(d, value):
-    stdTreeIteratorHelper(d, value)
-
-def qdump__std__set__iterator(d, value):
-    stdTreeIteratorHelper(d, value)
-
-def qdump__std__set__const_iterator(d, value):
-    stdTreeIteratorHelper(d, value)
-
-def qdump__std____cxx1998__set(d, value):
-    qdump__std__set(d, value)
-
-def qdump__std__set(d, value):
-    impl = value["_M_t"]["_M_impl"]
-    size = int(impl["_M_node_count"])
-    d.check(0 <= size and size <= 100*1000*1000)
-    d.putItemCount(size)
-    d.putNumChild(size)
-    if d.isExpanded():
-        valueType = d.templateArgument(value.type, 0)
-        node = impl["_M_header"]["_M_left"]
-        with Children(d, size, maxNumChild=1000, childType=valueType):
-            for i in d.childRange():
-                d.putSubItem(i, (node + 1).cast(valueType.pointer()).dereference())
-                if d.isNull(node["_M_right"]):
-                    parent = node["_M_parent"]
-                    while node == parent["_M_right"]:
-                        node = parent
-                        parent = parent["_M_parent"]
-                    if node["_M_right"] != parent:
-                        node = parent
-                else:
-                    node = node["_M_right"]
-                    while not d.isNull(node["_M_left"]):
-                        node = node["_M_left"]
-
-
-def qdump__std__stack(d, value):
-    qdump__std__deque(d, value["c"])
-
-def qdump__std____debug__stack(d, value):
-    qdump__std__stack(d, value)
-
-def qform__std__string():
-    return "Inline,In Separate Window"
-
-def qdump__std__string(d, value):
-    qdump__std__stringHelper1(d, value, 1)
-
-def qdump__std__stringHelper1(d, value, charSize):
-    data = value["_M_dataplus"]["_M_p"]
-    # We can't lookup the std::string::_Rep type without crashing LLDB,
-    # so hard-code assumption on member position
-    # struct { size_type _M_length, size_type _M_capacity, int _M_refcount; }
-    sizePtr = data.cast(d.sizetType().pointer())
-    size = int(sizePtr[-3])
-    alloc = int(sizePtr[-2])
-    refcount = int(sizePtr[-1])
-    d.check(refcount >= -1) # Can be -1 accoring to docs.
-    d.check(0 <= size and size <= alloc and alloc <= 100*1000*1000)
-    qdump_stringHelper(d, sizePtr, size * charSize, charSize)
-
-def qdump_stringHelper(d, data, size, charSize):
-    cutoff = min(size, qqStringCutOff)
-    mem = d.readMemory(data, cutoff)
-    if charSize == 1:
-        encodingType = Hex2EncodedLatin1
-        displayType = DisplayLatin1String
-    elif charSize == 2:
-        encodingType = Hex4EncodedLittleEndian
-        displayType = DisplayUtf16String
-    else:
-        encodingType = Hex8EncodedLittleEndian
-        displayType = DisplayUtf16String
-
-    d.putNumChild(0)
-    d.putValue(mem, encodingType)
-
-    format = d.currentItemFormat()
-    if format == 1:
-        d.putDisplay(StopDisplay)
-    elif format == 2:
-        d.putField("editformat", displayType)
-        d.putField("editvalue", d.readMemory(data, size))
-
-
-def qdump__std____1__string(d, value):
-    inner = d.childAt(d.childAt(value["__r_"]["__first_"], 0), 0)
-    size = int(inner["__size_"])
-    alloc = int(inner["__cap_"])
-    data = d.pointerValue(inner["__data_"])
-    qdump_stringHelper(d, data, size, 1)
-    d.putType("std::string")
-
-
-def qdump__std____1__wstring(d, value):
-    inner = d.childAt(d.childAt(value["__r_"]["__first_"], 0), 0)
-    size = int(inner["__size_"]) * 4
-    alloc = int(inner["__cap_"])
-    data = d.pointerValue(inner["__data_"])
-    qdump_stringHelper(d, data, size, 4)
-    d.putType("std::wstring")
-
-
-def qdump__std__shared_ptr(d, value):
-    i = value["_M_ptr"]
-    if d.isNull(i):
-        d.putValue("(null)")
-        d.putNumChild(0)
-        return
-
-    if d.isSimpleType(d.templateArgument(value.type, 0)):
-        d.putValue("%s @0x%x" % (i.dereference(), d.pointerValue(i)))
-    else:
-        i = expensiveDowncast(i)
-        d.putValue("@0x%x" % d.pointerValue(i))
-
-    d.putNumChild(3)
-    with Children(d, 3):
-        d.putSubItem("data", i)
-        refcount = value["_M_refcount"]["_M_pi"]
-        d.putIntItem("usecount", refcount["_M_use_count"])
-        d.putIntItem("weakcount", refcount["_M_weak_count"])
-
-def qdump__std____1__shared_ptr(d, value):
-    i = value["__ptr_"]
-    if d.isNull(i):
-        d.putValue("(null)")
-        d.putNumChild(0)
-        return
-
-    if d.isSimpleType(d.templateArgument(value.type, 0)):
-        d.putValue("%s @0x%x" % (i.dereference().value, d.pointerValue(i)))
-    else:
-        d.putValue("@0x%x" % d.pointerValue(i))
-
-    d.putNumChild(3)
-    with Children(d, 3):
-        d.putSubItem("data", i.dereference())
-        d.putFields(value["__cntrl_"].dereference())
-        #d.putIntItem("usecount", refcount["_M_use_count"])
-        #d.putIntItem("weakcount", refcount["_M_weak_count"])
-
-def qdump__std__unique_ptr(d, value):
-    i = value["_M_t"]["_M_head_impl"]
-    if d.isNull(i):
-        d.putValue("(null)")
-        d.putNumChild(0)
-        return
-
-    if d.isSimpleType(d.templateArgument(value.type, 0)):
-        d.putValue("%s @0x%x" % (i.dereference(), d.pointerValue(i)))
-    else:
-        i = expensiveDowncast(i)
-        d.putValue("@0x%x" % d.pointerValue(i))
-
-    d.putNumChild(1)
-    with Children(d, 1):
-        d.putSubItem("data", i)
-
-def qdump__std____1__unique_ptr(d, value):
-    i = d.childAt(d.childAt(value["__ptr_"], 0), 0)
-    if d.isNull(i):
-        d.putValue("(null)")
-        d.putNumChild(0)
-        return
-
-    if d.isSimpleType(d.templateArgument(value.type, 0)):
-        d.putValue("%s @0x%x" % (i.dereference().value, d.pointerValue(i)))
-    else:
-        d.putValue("@0x%x" % d.pointerValue(i))
-
-    d.putNumChild(1)
-    with Children(d, 1):
-        d.putSubItem("data", i.dereference())
-
-
-def qform__std__unordered_map():
-    return mapForms()
-
-def qform__std____debug__unordered_map():
-    return mapForms()
-
-def qdump__std__unordered_map(d, value):
-    try:
-        size = value["_M_element_count"]
-        start = value["_M_before_begin"]["_M_nxt"]
-    except:
-        size = value["_M_h"]["_M_element_count"]
-        start = value["_M_h"]["_M_bbegin"]["_M_node"]["_M_nxt"]
-    d.putItemCount(size)
-    d.putNumChild(size)
-    if d.isExpanded():
-        p = d.pointerValue(start)
-        keyType = d.templateArgument(value.type, 0)
-        valueType = d.templateArgument(value.type, 1)
-        allocatorType = d.templateArgument(value.type, 4)
-        pairType = d.templateArgument(allocatorType, 0)
-        ptrSize = d.ptrSize()
-        if d.isMapCompact(keyType, valueType):
-            with Children(d, size, childType=valueType):
-                for i in d.childRange():
-                    pair = d.createValue(p + ptrSize, pairType)
-                    with SubItem(d, i):
-                        d.putField("iname", d.currentIName)
-                        d.putName("[%s] %s" % (i, pair["first"]))
-                        d.putValue(pair["second"])
-                    p = d.dereference(p)
-        else:
-            with Children(d, size, childType=pairType):
-                for i in d.childRange():
-                    d.putSubItem(i, d.createValue(p + ptrSize, pairType))
-                    p = d.dereference(p)
-
-def qdump__std____debug__unordered_map(d, value):
-    qdump__std__unordered_map(d, value)
-
-def qdump__std__unordered_set(d, value):
-    try:
-        size = value["_M_element_count"]
-        start = value["_M_before_begin"]["_M_nxt"]
-    except:
-        size = value["_M_h"]["_M_element_count"]
-        start = value["_M_h"]["_M_bbegin"]["_M_node"]["_M_nxt"]
-    d.putItemCount(size)
-    d.putNumChild(size)
-    if d.isExpanded():
-        p = d.pointerValue(start)
-        valueType = d.templateArgument(value.type, 0)
-        with Children(d, size, childType=valueType):
-            ptrSize = d.ptrSize()
-            for i in d.childRange():
-                d.putSubItem(i, d.createValue(p + ptrSize, valueType))
-                p = d.dereference(p)
-
-def qdump__std____debug__unordered_set(d, value):
-    qdump__std__unordered_set(d, value)
-
-
-def qedit__std__vector(expr, value):
-    values = value.split(',')
-    n = len(values)
-    ob = gdb.parse_and_eval(expr)
-    innerType = d.templateArgument(ob.type, 0)
-    cmd = "set $d = (%s*)calloc(sizeof(%s)*%s,1)" % (innerType, innerType, n)
-    gdb.execute(cmd)
-    cmd = "set {void*[3]}%s = {$d, $d+%s, $d+%s}" % (ob.address, n, n)
-    gdb.execute(cmd)
-    cmd = "set (%s[%d])*$d={%s}" % (innerType, n, value)
-    gdb.execute(cmd)
-
-def qdump__std__vector(d, value):
-    impl = value["_M_impl"]
-    type = d.templateArgument(value.type, 0)
-    alloc = impl["_M_end_of_storage"]
-    isBool = str(type) == 'bool'
-    if isBool:
-        start = impl["_M_start"]["_M_p"]
-        finish = impl["_M_finish"]["_M_p"]
-        # FIXME: 8 is CHAR_BIT
-        storage = d.lookupType("unsigned long")
-        storagesize = storage.sizeof * 8
-        size = (finish - start) * storagesize
-        size += impl["_M_finish"]["_M_offset"]
-        size -= impl["_M_start"]["_M_offset"]
-    else:
-        start = impl["_M_start"]
-        finish = impl["_M_finish"]
-        size = finish - start
-
-    d.check(0 <= size and size <= 1000 * 1000 * 1000)
-    d.check(finish <= alloc)
-    d.checkPointer(start)
-    d.checkPointer(finish)
-    d.checkPointer(alloc)
-
-    d.putItemCount(size)
-    d.putNumChild(size)
-    if d.isExpanded():
-        if isBool:
-            with Children(d, size, maxNumChild=10000, childType=type):
-                for i in d.childRange():
-                    q = start + int(i / storagesize)
-                    d.putBoolItem(str(i), (q.dereference() >> (i % storagesize)) & 1)
-        else:
-            d.putArrayData(type, start, size)
-
-def qdump__std____1__vector(d, value):
-    innerType = d.templateArgument(value.type, 0)
-    if d.isLldb and d.childAt(value, 0).type == innerType:
-        # That's old lldb automatically formatting
-        begin = d.dereferenceValue(value)
-        size = value.GetNumChildren()
-    else:
-        # Normal case
-        begin = d.pointerValue(value['__begin_'])
-        end = d.pointerValue(value['__end_'])
-        size = (end - begin) / innerType.sizeof
-
-    d.putItemCount(size)
-    d.putNumChild(size)
-    if d.isExpanded():
-        d.putArrayData(innerType, begin, size)
-
-
-def qdump__std____debug__vector(d, value):
-    qdump__std__vector(d, value)
-
-def qedit__std__string(expr, value):
-    cmd = "print (%s).assign(\"%s\")" % (expr, value)
-    gdb.execute(cmd)
-
-def qedit__string(expr, value):
-    qedit__std__string(expr, value)
-
-def qdump__string(d, value):
-    qdump__std__string(d, value)
-
-def qdump__std__wstring(d, value):
-    charSize = d.lookupType('wchar_t').sizeof
-    qdump__std__stringHelper1(d, value, charSize)
-
-def qdump__std__basic_string(d, value):
-    innerType = d.templateArgument(value.type, 0)
-    qdump__std__stringHelper1(d, value, innerType.sizeof)
-
-def qdump__wstring(d, value):
-    qdump__std__wstring(d, value)
-
-
-def qdump____gnu_cxx__hash_set(d, value):
-    ht = value["_M_ht"]
-    size = int(ht["_M_num_elements"])
-    d.check(0 <= size and size <= 1000 * 1000 * 1000)
-    d.putItemCount(size)
-    d.putNumChild(size)
-    type = d.templateArgument(value.type, 0)
-    d.putType("__gnu__cxx::hash_set<%s>" % type)
-    if d.isExpanded():
-        with Children(d, size, maxNumChild=1000, childType=type):
-            buckets = ht["_M_buckets"]["_M_impl"]
-            bucketStart = buckets["_M_start"]
-            bucketFinish = buckets["_M_finish"]
-            p = bucketStart
-            itemCount = 0
-            for i in xrange(toInteger(bucketFinish - bucketStart)):
-                if not d.isNull(p.dereference()):
-                    cur = p.dereference()
-                    while not d.isNull(cur):
-                        with SubItem(d, itemCount):
-                            d.putValue(cur["_M_val"])
-                            cur = cur["_M_next"]
-                            itemCount += 1
-                p = p + 1
-
-
-def qdump__uint8_t(d, value):
-    d.putNumChild(0)
-    d.putValue(int(value))
-
-def qdump__int8_t(d, value):
-    d.putNumChild(0)
-    d.putValue(int(value))
-
-#######################################################################
-#
-# Boost dumper
-#
-#######################################################################
-
-def qdump__boost__bimaps__bimap(d, value):
-    #leftType = d.templateArgument(value.type, 0)
-    #rightType = d.templateArgument(value.type, 1)
-    size = int(value["core"]["node_count"])
-    d.putItemCount(size)
-    d.putNumChild(size)
-    if d.isExpanded():
-        d.putPlainChildren(value)
-
-
-def qdump__boost__optional(d, value):
-    if int(value["m_initialized"]) == 0:
-        d.putValue("<uninitialized>")
-        d.putNumChild(0)
-    else:
-        type = d.templateArgument(value.type, 0)
-        storage = value["m_storage"]
-        if d.isReferenceType(type):
-            d.putItem(storage.cast(type.target().pointer()).dereference())
-        else:
-            d.putItem(storage.cast(type))
-        d.putBetterType(value.type)
-
-
-def qdump__boost__shared_ptr(d, value):
-    # s                  boost::shared_ptr<int>
-    #    pn              boost::detail::shared_count
-    #        pi_ 0x0     boost::detail::sp_counted_base *
-    #    px      0x0     int *
-    if d.isNull(value["pn"]["pi_"]):
-        d.putValue("(null)")
-        d.putNumChild(0)
-        return
-
-    if d.isNull(value["px"]):
-        d.putValue("(null)")
-        d.putNumChild(0)
-        return
-
-    countedbase = value["pn"]["pi_"].dereference()
-    weakcount = int(countedbase["weak_count_"])
-    usecount = int(countedbase["use_count_"])
-    d.check(weakcount >= 0)
-    d.check(weakcount <= int(usecount))
-    d.check(usecount <= 10*1000*1000)
-
-    val = value["px"].dereference()
-    if d.isSimpleType(val.type):
-        d.putNumChild(3)
-        d.putItem(val)
-        d.putBetterType(value.type)
-    else:
-        d.putEmptyValue()
-
-    d.putNumChild(3)
-    if d.isExpanded():
-        with Children(d, 3):
-            d.putSubItem("data", val)
-            d.putIntItem("weakcount", weakcount)
-            d.putIntItem("usecount", usecount)
-
-
-def qdump__boost__gregorian__date(d, value):
-    d.putValue(int(value["days_"]), JulianDate)
-    d.putNumChild(0)
-
-
-def qdump__boost__posix_time__ptime(d, item):
-    ms = int(item["time_"]["time_count_"]["value_"]) / 1000
-    d.putValue("%s/%s" % divmod(ms, 86400000), JulianDateAndMillisecondsSinceMidnight)
-    d.putNumChild(0)
-
-
-def qdump__boost__posix_time__time_duration(d, item):
-    d.putValue(int(item["ticks_"]["value_"]) / 1000, MillisecondsSinceMidnight)
-    d.putNumChild(0)
-
-
-#######################################################################
-#
-# SSE
-#
-#######################################################################
-
-def qform____m128():
-    return "As Floats,As Doubles"
-
-def qdump____m128(d, value):
-    d.putEmptyValue()
-    d.putNumChild(1)
-    if d.isExpanded():
-        format = d.currentItemFormat()
-        if format == 2: # As Double
-            d.putArrayData(d.lookupType("double"), value.address, 2)
-        else: # Default, As float
-            d.putArrayData(d.lookupType("float"), value.address, 4)
-
-
 #######################################################################
 #
 # Webkit
@@ -2802,374 +2119,3 @@ def qdump__QScriptValue(d, value):
         with Children(d):
            d.putSubItem("jscValue", dd["jscValue"])
 
-
-#######################################################################
-#
-# Qt Creator
-#
-#######################################################################
-
-def qdump__Core__Id(d, value):
-    try:
-        name = parseAndEvaluate("Core::nameForId(%d)" % value["m_id"])
-        d.putValue(encodeCharArray(name), Hex2EncodedLatin1)
-        d.putPlainChildren(value)
-    except:
-        d.putValue(value["m_id"])
-        d.putNumChild(0)
-
-def qdump__Debugger__Internal__GdbMi(d, value):
-    str = d.encodeByteArray(value["m_name"]) + "3a20" \
-        + d.encodeByteArray(value["m_data"])
-    d.putValue(str, Hex2EncodedLatin1)
-    d.putPlainChildren(value)
-
-def qdump__Debugger__Internal__WatchData(d, value):
-    d.putByteArrayValue(value["iname"])
-    d.putPlainChildren(value)
-
-def qdump__Debugger__Internal__WatchItem(d, value):
-    d.putByteArrayValue(value["iname"])
-    d.putPlainChildren(value)
-
-def qdump__Debugger__Internal__BreakpointModelId(d, value):
-    d.putValue("%s.%s" % (value["m_majorPart"], value["m_minorPart"]))
-    d.putPlainChildren(value)
-
-def qdump__CPlusPlus__ByteArrayRef(d, value):
-    d.putValue(encodeCharArray(value["m_start"], 100, value["m_length"]),
-        Hex2EncodedLatin1)
-    d.putPlainChildren(value)
-
-def qdump__CPlusPlus__Identifier(d, value):
-    d.putValue(encodeCharArray(value["_chars"]), Hex2EncodedLatin1)
-    d.putPlainChildren(value)
-
-def qdump__CPlusPlus__IntegerType(d, value):
-    d.putValue(value["_kind"])
-    d.putPlainChildren(value)
-
-def qdump__CPlusPlus__NamedType(d, value):
-    literal = downcast(value["_name"])
-    d.putValue(encodeCharArray(literal["_chars"]), Hex2EncodedLatin1)
-    d.putPlainChildren(value)
-
-def qdump__CPlusPlus__TemplateNameId(d, value):
-    s = encodeCharArray(value["_identifier"]["_chars"])
-    d.putValue(s + "3c2e2e2e3e", Hex2EncodedLatin1)
-    d.putPlainChildren(value)
-
-def qdump__CPlusPlus__Literal(d, value):
-    d.putValue(encodeCharArray(value["_chars"]), Hex2EncodedLatin1)
-    d.putPlainChildren(value)
-
-def qdump__CPlusPlus__StringLiteral(d, value):
-    d.putValue(encodeCharArray(value["_chars"]), Hex2EncodedLatin1)
-    d.putPlainChildren(value)
-
-def qdump__CPlusPlus__Internal__Value(d, value):
-    d.putValue(value["l"])
-    d.putPlainChildren(value)
-
-def qdump__Utils__FileName(d, value):
-    d.putStringValue(value)
-    d.putPlainChildren(value)
-
-def qdump__Utils__ElfSection(d, value):
-    d.putByteArrayValue(value["name"])
-    d.putPlainChildren(value)
-
-def qdump__CPlusPlus__Token(d, value):
-    k = int(value["f"]["kind"])
-    if int(k) == 6:
-        d.putValue("T_IDENTIFIER. offset: %d, len: %d"
-            % (value["offset"], value["f"]["length"]))
-    elif int(k) == 7:
-        d.putValue("T_NUMERIC_LITERAL. offset: %d, value: %d"
-            % (value["offset"], value["f"]["length"]))
-    elif int(k) == 60:
-        d.putValue("T_RPAREN")
-    else:
-        d.putValue("Type: %s" % k)
-    d.putPlainChildren(value)
-
-def qdump__CPlusPlus__Internal__PPToken(d, value):
-    k = value["f"]["kind"];
-    data, size, alloc = d.byteArrayData(value["m_src"])
-    length = int(value["f"]["length"])
-    offset = int(value["offset"])
-    #warn("size: %s, alloc: %s, offset: %s, length: %s, data: %s"
-    #    % (size, alloc, offset, length, data))
-    d.putValue(d.readMemory(data + offset, min(100, length)),
-        Hex2EncodedLatin1)
-    d.putPlainChildren(value)
-
-
-#######################################################################
-#
-# Eigen
-#
-#######################################################################
-
-#def qform__Eigen__Matrix():
-#    return "Transposed"
-
-def qdump__Eigen__Matrix(d, value):
-    innerType = d.templateArgument(value.type, 0)
-    storage = value["m_storage"]
-    options = d.numericTemplateArgument(value.type, 3)
-    rowMajor = (int(options) & 0x1)
-    argRow = d.numericTemplateArgument(value.type, 1)
-    argCol = d.numericTemplateArgument(value.type, 2)
-    nrows = value["m_storage"]["m_rows"] if argRow == -1 else int(argRow)
-    ncols = value["m_storage"]["m_cols"] if argCol == -1 else int(argCol)
-    p = storage["m_data"]
-    if d.isStructType(p.type): # Static
-        p = p["array"].cast(innerType.pointer())
-    d.putValue("(%s x %s), %s" % (nrows, ncols, ["ColumnMajor", "RowMajor"][rowMajor]))
-    d.putField("keeporder", "1")
-    d.putNumChild(nrows * ncols)
-
-    limit = 10000
-    nncols = min(ncols, limit)
-    nnrows = min(nrows, limit * limit / nncols)
-    if d.isExpanded():
-        #format = d.currentItemFormat() # format == 1 is "Transposed"
-        with Children(d, nrows * ncols, childType=innerType):
-            if ncols == 1 or nrows == 1:
-                for i in range(0, min(nrows * ncols, 10000)):
-                    d.putSubItem(i, (p + i).dereference())
-            elif rowMajor == 1:
-                s = 0
-                for i in range(0, nnrows):
-                    for j in range(0, nncols):
-                        v = (p + i * ncols + j).dereference()
-                        d.putNamedSubItem(s, v, "[%d,%d]" % (i, j))
-                        s = s + 1
-            else:
-                s = 0
-                for j in range(0, nncols):
-                    for i in range(0, nnrows):
-                        v = (p + i + j * nrows).dereference()
-                        d.putNamedSubItem(s, v, "[%d,%d]" % (i, j))
-                        s = s + 1
-
-
-#######################################################################
-#
-# D
-#
-#######################################################################
-
-def cleanDType(type):
-    return d.stripClassTag(str(type)).replace("uns long long", "string")
-
-def qdump_Array(d, value):
-    n = value["length"]
-    p = value["ptr"]
-    t = cleanDType(value.type)[7:]
-    d.putType("%s[%d]" % (t, n))
-    if t == "char":
-        d.putValue(encodeCharArray(p, 100), Hex2EncodedLocal8Bit)
-        d.putNumChild(0)
-    else:
-        d.putEmptyValue()
-        d.putNumChild(n)
-        innerType = p.type
-        if d.isExpanded():
-            with Children(d, n, childType=innerType):
-                for i in range(0, n):
-                    d.putSubItem(i, p.dereference())
-                    p = p + 1
-
-
-def qdump_AArray(d, value):
-    #n = value["length"]
-    # This ends up as _AArray_<key>_<value> with a single .ptr
-    # member of type void *. Not much that can be done here.
-    p = value["ptr"]
-    t = cleanDType(value.type)[8:]
-    d.putType("%s]" % t.replace("_", "["))
-    d.putEmptyValue()
-    d.putNumChild(1)
-    if d.isExpanded():
-        with Children(d, 1):
-                d.putSubItem("ptr", p)
-
-
-#######################################################################
-#
-# Display Test
-#
-#######################################################################
-
-if False:
-
-    # FIXME: Make that work
-    def qdump__Color(d, value):
-        v = value
-        d.putValue("(%s, %s, %s; %s)" % (v["r"], v["g"], v["b"], v["a"]))
-        d.putPlainChildren(value)
-
-    def qdump__Color_(d, value):
-        v = value
-        d.putValue("(%s, %s, %s; %s)" % (v["r"], v["g"], v["b"], v["a"]))
-        if d.isExpanded():
-            with Children(d):
-                with SubItem(d, "0"):
-                    d.putItem(v["r"])
-                with SubItem(d, "1"):
-                    d.putItem(v["g"])
-                with SubItem(d, "2"):
-                    d.putItem(v["b"])
-                with SubItem(d, "3"):
-                    d.putItem(v["a"])
-
-
-if False:
-
-    def qform__basic__Function():
-        return "Normal,Displayed"
-
-    def qdump__basic__Function(d, value):
-        min = value["min"]
-        max = value["max"]
-        data, size, alloc = d.byteArrayData(value["var"])
-        var = extractCString(data, 0)
-        data, size, alloc = d.byteArrayData(value["f"])
-        f = extractCString(data, 0)
-        d.putValue("%s, %s=%f..%f" % (f, var, min, max))
-        d.putNumChild(0)
-        format = d.currentItemFormat()
-        if format == 1:
-            d.putDisplay(StopDisplay)
-        elif format == 2:
-            input = "plot [%s=%f:%f] %s" % (var, min, max, f)
-            d.putDisplay(DisplayProcess, input, "gnuplot")
-
-
-if False:
-
-    def qdump__tree_entry(d, value):
-        d.putValue("len: %s, offset: %s, type: %s" %
-            (value["blocklength"], value["offset"], value["type"]))
-        d.putNumChild(0)
-
-    def qdump__tree(d, value):
-        count = value["count"]
-        entries = value["entries"]
-        base = value["base"].cast(d.charPtrType())
-        d.putItemCount(count)
-        d.putNumChild(count)
-        if d.isExpanded():
-          with Children(d):
-            with SubItem(d, "tree"):
-              d.putEmptyValue()
-              d.putNoType()
-              d.putNumChild(1)
-              if d.isExpanded():
-                with Children(d):
-                  for i in xrange(count):
-                      d.putSubItem(Item(entries[i], iname))
-            with SubItem(d, "data"):
-              d.putEmptyValue()
-              d.putNoType()
-              d.putNumChild(1)
-              if d.isExpanded():
-                 with Children(d):
-                    for i in xrange(count):
-                      with SubItem(d, i):
-                        entry = entries[i]
-                        mpitype = str(entry["type"])
-                        d.putType(mpitype)
-                        length = int(entry["blocklength"])
-                        offset = int(entry["offset"])
-                        d.putValue("%s items at %s" % (length, offset))
-                        if mpitype == "MPI_INT":
-                          innerType = "int"
-                        elif mpitype == "MPI_CHAR":
-                          innerType = "char"
-                        elif mpitype == "MPI_DOUBLE":
-                          innerType = "double"
-                        else:
-                          length = 0
-                        d.putNumChild(length)
-                        if d.isExpanded():
-                           with Children(d):
-                              t = d.lookupType(innerType).pointer()
-                              p = (base + offset).cast(t)
-                              for j in range(length):
-                                d.putSubItem(j, p.dereference())
-
-    #struct KRBase
-    #{
-    #    enum Type { TYPE_A, TYPE_B } type;
-    #    KRBase(Type _type) : type(_type) {}
-    #};
-    #
-    #struct KRA : KRBase { int x; int y; KRA():KRBase(TYPE_A),x(1),y(32) {} };
-    #struct KRB : KRBase { KRB():KRBase(TYPE_B) {}  };
-    #
-    #void testKR()
-    #{
-    #    KRBase *ptr1 = new KRA;
-    #    KRBase *ptr2 = new KRB;
-    #    ptr2 = new KRB;
-    #}
-
-    def qdump__KRBase(d, value):
-        if getattr(value, "__nested__", None) is None:
-            base = ["KRA", "KRB"][int(value["type"])]
-            nest = value.cast(d.lookupType(base))
-            nest.__nested__ = True
-            warn("NEST %s " % dir(nest))
-            d.putItem(nest)
-        else:
-            d.putName("type")
-            d.putValue(value["type"])
-            d.putNoType()
-
-
-
-if False:
-    def qdump__bug5106__A5106(d, value):
-        d.putName("a")
-        d.putValue("This is the value: %s" % value["m_a"])
-        d.putNoType()
-        d.putNumChild(0)
-
-
-if False:
-    def qdump__bug6933__Base(d, value):
-        d.putValue("foo")
-        d.putPlainChildren(value)
-
-if False:
-    def qdump__gdb13393__Base(d, value):
-        d.putValue("Base (%s)" % value["a"])
-        d.putType(value.type)
-        d.putPlainChildren(value)
-
-    def qdump__gdb13393__Derived(d, value):
-        d.putValue("Derived (%s, %s)" % (value["a"], value["b"]))
-        d.putType(value.type)
-        d.putPlainChildren(value)
-
-
-def qdump__KDSoapValue1(d, value):
-    inner = value["d"]["d"].dereference()
-    d.putStringValue(inner["m_name"])
-    if d.isExpanded():
-        with Children(d):
-            d.putFields(inner)
-
-def indirect(value):
-    return value.cast(lookupType("char*"))
-
-def qdump__KDSoapValue(d, value):
-    p = (value.cast(lookupType("char*")) + 4).dereference().cast(lookupType("QString"))
-    d.putStringValue(p)
-    if d.isExpanded():
-        with Children(d):
-            data = value["d"]["d"].dereference()
-            d.putFields(data)
diff --git a/share/qtcreator/debugger/stdtypes.py b/share/qtcreator/debugger/stdtypes.py
new file mode 100644
index 0000000000000000000000000000000000000000..4d6ac1bd1a988fae6f7da7d48ecdfc47a705a023
--- /dev/null
+++ b/share/qtcreator/debugger/stdtypes.py
@@ -0,0 +1,625 @@
+############################################################################
+#
+# Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+# Contact: http://www.qt-project.org/legal
+#
+# This file is part of Qt Creator.
+#
+# Commercial License Usage
+# Licensees holding valid commercial Qt licenses may use this file in
+# accordance with the commercial license agreement provided with the
+# Software or, alternatively, in accordance with the terms contained in
+# a written agreement between you and Digia.  For licensing terms and
+# conditions see http://qt.digia.com/licensing.  For further information
+# use the contact form at http://qt.digia.com/contact-us.
+#
+# GNU Lesser General Public License Usage
+# Alternatively, this file may be used under the terms of the GNU Lesser
+# General Public License version 2.1 as published by the Free Software
+# Foundation and appearing in the file LICENSE.LGPL included in the
+# packaging of this file.  Please review the following information to
+# ensure the GNU Lesser General Public License version 2.1 requirements
+# will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+#
+# In addition, as a special exception, Digia gives you certain additional
+# rights.  These rights are described in the Digia Qt LGPL Exception
+# version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+#
+#############################################################################
+
+from dumper import *
+
+def qdump____c_style_array__(d, value):
+    type = value.type.unqualified()
+    targetType = value[0].type
+    #d.putAddress(value.address)
+    d.putType(type)
+    d.putNumChild(1)
+    format = d.currentItemFormat()
+    isDefault = format == None and str(targetType.unqualified()) == "char"
+    if isDefault or format == 0 or format == 1 or format == 2:
+        blob = d.readMemory(value.address, type.sizeof)
+
+    if isDefault:
+        # Use Latin1 as default for char [].
+        d.putValue(blob, Hex2EncodedLatin1)
+    elif format == 0:
+        # Explicitly requested Latin1 formatting.
+        d.putValue(blob, Hex2EncodedLatin1)
+    elif format == 1:
+        # Explicitly requested UTF-8 formatting.
+        d.putValue(blob, Hex2EncodedUtf8)
+    elif format == 2:
+        # Explicitly requested Local 8-bit formatting.
+        d.putValue(blob, Hex2EncodedLocal8Bit)
+    else:
+        d.putValue("@0x%x" % d.pointerValue(value.cast(targetType.pointer())))
+
+    if d.currentIName in d.expandedINames:
+        p = value.address
+        ts = targetType.sizeof
+        if not d.tryPutArrayContents(targetType, p, int(type.sizeof / ts)):
+            with Children(d, childType=targetType,
+                    addrBase=p, addrStep=ts):
+                d.putFields(value)
+
+
+def qdump__std__array(d, value):
+    size = d.numericTemplateArgument(value.type, 1)
+    d.putItemCount(size)
+    d.putNumChild(size)
+    if d.isExpanded():
+        innerType = d.templateArgument(value.type, 0)
+        d.putArrayData(innerType, d.addressOf(value), size)
+
+
+def qdump__std____1__array(d, value):
+    qdump__std__array(d, value)
+
+
+def qdump__std__complex(d, value):
+    innerType = d.templateArgument(value.type, 0)
+    base = value.address.cast(innerType.pointer())
+    real = base.dereference()
+    imag = (base + 1).dereference()
+    d.putValue("(%f, %f)" % (real, imag));
+    d.putNumChild(2)
+    if d.isExpanded():
+        with Children(d, 2, childType=innerType):
+            d.putSubItem("real", real)
+            d.putSubItem("imag", imag)
+
+
+def qdump__std__deque(d, value):
+    innerType = d.templateArgument(value.type, 0)
+    innerSize = innerType.sizeof
+    bufsize = 1
+    if innerSize < 512:
+        bufsize = int(512 / innerSize)
+
+    impl = value["_M_impl"]
+    start = impl["_M_start"]
+    finish = impl["_M_finish"]
+    size = bufsize * toInteger(finish["_M_node"] - start["_M_node"] - 1)
+    size += toInteger(finish["_M_cur"] - finish["_M_first"])
+    size += toInteger(start["_M_last"] - start["_M_cur"])
+
+    d.check(0 <= size and size <= 1000 * 1000 * 1000)
+    d.putItemCount(size)
+    d.putNumChild(size)
+    if d.isExpanded():
+        with Children(d, size, maxNumChild=2000, childType=innerType):
+            pcur = start["_M_cur"]
+            pfirst = start["_M_first"]
+            plast = start["_M_last"]
+            pnode = start["_M_node"]
+            for i in d.childRange():
+                d.putSubItem(i, pcur.dereference())
+                pcur += 1
+                if pcur == plast:
+                    newnode = pnode + 1
+                    pnode = newnode
+                    pfirst = newnode.dereference()
+                    plast = pfirst + bufsize
+                    pcur = pfirst
+
+def qdump__std____debug__deque(d, value):
+    qdump__std__deque(d, value)
+
+
+def qdump__std__list(d, value):
+    head = d.dereferenceValue(value)
+    impl = value["_M_impl"]
+    node = impl["_M_node"]
+    size = 0
+    pp = d.dereference(head)
+    while head != pp and size <= 1001:
+        size += 1
+        pp = d.dereference(pp)
+
+    d.putItemCount(size, 1000)
+    d.putNumChild(size)
+
+    if d.isExpanded():
+        p = node["_M_next"]
+        innerType = d.templateArgument(value.type, 0)
+        with Children(d, size, maxNumChild=1000, childType=innerType):
+            for i in d.childRange():
+                innerPointer = innerType.pointer()
+                d.putSubItem(i, (p + 1).cast(innerPointer).dereference())
+                p = p["_M_next"]
+
+def qdump__std____debug__list(d, value):
+    qdump__std__list(d, value)
+
+def qform__std__map():
+    return mapForms()
+
+def qdump__std__map(d, value):
+    impl = value["_M_t"]["_M_impl"]
+    size = int(impl["_M_node_count"])
+    d.check(0 <= size and size <= 100*1000*1000)
+    d.putItemCount(size)
+    d.putNumChild(size)
+
+    if d.isExpanded():
+        keyType = d.templateArgument(value.type, 0)
+        valueType = d.templateArgument(value.type, 1)
+        try:
+            # Does not work on gcc 4.4, the allocator type (fourth template
+            # argument) seems not to be available.
+            pairType = d.templateArgument(d.templateArgument(value.type, 3), 0)
+            pairPointer = pairType.pointer()
+        except:
+            # So use this as workaround:
+            pairType = d.templateArgument(impl.type, 1)
+            pairPointer = pairType.pointer()
+        isCompact = d.isMapCompact(keyType, valueType)
+        innerType = pairType
+        if isCompact:
+            innerType = valueType
+        node = impl["_M_header"]["_M_left"]
+        childType = innerType
+        if size == 0:
+            childType = pairType
+        childNumChild = 2
+        if isCompact:
+            childNumChild = None
+        with Children(d, size, maxNumChild=1000,
+                childType=childType, childNumChild=childNumChild):
+            for i in d.childRange():
+                with SubItem(d, i):
+                    pair = (node + 1).cast(pairPointer).dereference()
+                    if isCompact:
+                        d.putMapName(pair["first"])
+                        d.putItem(pair["second"])
+                    else:
+                        d.putEmptyValue()
+                        if d.isExpanded():
+                            with Children(d, 2):
+                                d.putSubItem("first", pair["first"])
+                                d.putSubItem("second", pair["second"])
+                if d.isNull(node["_M_right"]):
+                    parent = node["_M_parent"]
+                    while node == parent["_M_right"]:
+                        node = parent
+                        parent = parent["_M_parent"]
+                    if node["_M_right"] != parent:
+                        node = parent
+                else:
+                    node = node["_M_right"]
+                    while not d.isNull(node["_M_left"]):
+                        node = node["_M_left"]
+
+def qdump__std____debug__map(d, value):
+    qdump__std__map(d, value)
+
+def qdump__std____debug__set(d, value):
+    qdump__std__set(d, value)
+
+def qdump__std____cxx1998__map(d, value):
+    qdump__std__map(d, value)
+
+def stdTreeIteratorHelper(d, value):
+    pnode = value["_M_node"]
+    node = pnode.dereference()
+    d.putNumChild(1)
+    d.putEmptyValue()
+    if d.isExpanded():
+        dataType = d.templateArgument(value.type, 0)
+        nodeType = d.lookupType("std::_Rb_tree_node<%s>" % dataType)
+        data = pnode.cast(nodeType.pointer()).dereference()["_M_value_field"]
+        with Children(d):
+            try:
+                d.putSubItem("first", data["first"])
+                d.putSubItem("second", data["second"])
+            except:
+                d.putSubItem("value", data)
+            with SubItem(d, "node"):
+                d.putNumChild(1)
+                d.putEmptyValue()
+                d.putType(" ")
+                if d.isExpanded():
+                    with Children(d):
+                        d.putSubItem("color", node["_M_color"])
+                        d.putSubItem("left", node["_M_left"])
+                        d.putSubItem("right", node["_M_right"])
+                        d.putSubItem("parent", node["_M_parent"])
+
+
+def qdump__std___Rb_tree_iterator(d, value):
+    stdTreeIteratorHelper(d, value)
+
+def qdump__std___Rb_tree_const_iterator(d, value):
+    stdTreeIteratorHelper(d, value)
+
+def qdump__std__map__iterator(d, value):
+    stdTreeIteratorHelper(d, value)
+
+def qdump____gnu_debug___Safe_iterator(d, value):
+    d.putItem(value["_M_current"])
+
+def qdump__std__map__const_iterator(d, value):
+    stdTreeIteratorHelper(d, value)
+
+def qdump__std__set__iterator(d, value):
+    stdTreeIteratorHelper(d, value)
+
+def qdump__std__set__const_iterator(d, value):
+    stdTreeIteratorHelper(d, value)
+
+def qdump__std____cxx1998__set(d, value):
+    qdump__std__set(d, value)
+
+def qdump__std__set(d, value):
+    impl = value["_M_t"]["_M_impl"]
+    size = int(impl["_M_node_count"])
+    d.check(0 <= size and size <= 100*1000*1000)
+    d.putItemCount(size)
+    d.putNumChild(size)
+    if d.isExpanded():
+        valueType = d.templateArgument(value.type, 0)
+        node = impl["_M_header"]["_M_left"]
+        with Children(d, size, maxNumChild=1000, childType=valueType):
+            for i in d.childRange():
+                d.putSubItem(i, (node + 1).cast(valueType.pointer()).dereference())
+                if d.isNull(node["_M_right"]):
+                    parent = node["_M_parent"]
+                    while node == parent["_M_right"]:
+                        node = parent
+                        parent = parent["_M_parent"]
+                    if node["_M_right"] != parent:
+                        node = parent
+                else:
+                    node = node["_M_right"]
+                    while not d.isNull(node["_M_left"]):
+                        node = node["_M_left"]
+
+
+def qdump__std__stack(d, value):
+    qdump__std__deque(d, value["c"])
+
+def qdump__std____debug__stack(d, value):
+    qdump__std__stack(d, value)
+
+def qform__std__string():
+    return "Inline,In Separate Window"
+
+def qdump__std__string(d, value):
+    qdump__std__stringHelper1(d, value, 1)
+
+def qdump__std__stringHelper1(d, value, charSize):
+    data = value["_M_dataplus"]["_M_p"]
+    # We can't lookup the std::string::_Rep type without crashing LLDB,
+    # so hard-code assumption on member position
+    # struct { size_type _M_length, size_type _M_capacity, int _M_refcount; }
+    sizePtr = data.cast(d.sizetType().pointer())
+    size = int(sizePtr[-3])
+    alloc = int(sizePtr[-2])
+    refcount = int(sizePtr[-1])
+    d.check(refcount >= -1) # Can be -1 accoring to docs.
+    d.check(0 <= size and size <= alloc and alloc <= 100*1000*1000)
+    qdump_stringHelper(d, sizePtr, size * charSize, charSize)
+
+def qdump_stringHelper(d, data, size, charSize):
+    cutoff = min(size, qqStringCutOff)
+    mem = d.readMemory(data, cutoff)
+    if charSize == 1:
+        encodingType = Hex2EncodedLatin1
+        displayType = DisplayLatin1String
+    elif charSize == 2:
+        encodingType = Hex4EncodedLittleEndian
+        displayType = DisplayUtf16String
+    else:
+        encodingType = Hex8EncodedLittleEndian
+        displayType = DisplayUtf16String
+
+    d.putNumChild(0)
+    d.putValue(mem, encodingType)
+
+    format = d.currentItemFormat()
+    if format == 1:
+        d.putDisplay(StopDisplay)
+    elif format == 2:
+        d.putField("editformat", displayType)
+        d.putField("editvalue", d.readMemory(data, size))
+
+
+def qdump__std____1__string(d, value):
+    inner = d.childAt(d.childAt(value["__r_"]["__first_"], 0), 0)
+    size = int(inner["__size_"])
+    alloc = int(inner["__cap_"])
+    data = d.pointerValue(inner["__data_"])
+    qdump_stringHelper(d, data, size, 1)
+    d.putType("std::string")
+
+
+def qdump__std____1__wstring(d, value):
+    inner = d.childAt(d.childAt(value["__r_"]["__first_"], 0), 0)
+    size = int(inner["__size_"]) * 4
+    alloc = int(inner["__cap_"])
+    data = d.pointerValue(inner["__data_"])
+    qdump_stringHelper(d, data, size, 4)
+    d.putType("std::wstring")
+
+
+def qdump__std__shared_ptr(d, value):
+    i = value["_M_ptr"]
+    if d.isNull(i):
+        d.putValue("(null)")
+        d.putNumChild(0)
+        return
+
+    if d.isSimpleType(d.templateArgument(value.type, 0)):
+        d.putValue("%s @0x%x" % (i.dereference(), d.pointerValue(i)))
+    else:
+        i = expensiveDowncast(i)
+        d.putValue("@0x%x" % d.pointerValue(i))
+
+    d.putNumChild(3)
+    with Children(d, 3):
+        d.putSubItem("data", i)
+        refcount = value["_M_refcount"]["_M_pi"]
+        d.putIntItem("usecount", refcount["_M_use_count"])
+        d.putIntItem("weakcount", refcount["_M_weak_count"])
+
+def qdump__std____1__shared_ptr(d, value):
+    i = value["__ptr_"]
+    if d.isNull(i):
+        d.putValue("(null)")
+        d.putNumChild(0)
+        return
+
+    if d.isSimpleType(d.templateArgument(value.type, 0)):
+        d.putValue("%s @0x%x" % (i.dereference().value, d.pointerValue(i)))
+    else:
+        d.putValue("@0x%x" % d.pointerValue(i))
+
+    d.putNumChild(3)
+    with Children(d, 3):
+        d.putSubItem("data", i.dereference())
+        d.putFields(value["__cntrl_"].dereference())
+        #d.putIntItem("usecount", refcount["_M_use_count"])
+        #d.putIntItem("weakcount", refcount["_M_weak_count"])
+
+def qdump__std__unique_ptr(d, value):
+    i = value["_M_t"]["_M_head_impl"]
+    if d.isNull(i):
+        d.putValue("(null)")
+        d.putNumChild(0)
+        return
+
+    if d.isSimpleType(d.templateArgument(value.type, 0)):
+        d.putValue("%s @0x%x" % (i.dereference(), d.pointerValue(i)))
+    else:
+        i = expensiveDowncast(i)
+        d.putValue("@0x%x" % d.pointerValue(i))
+
+    d.putNumChild(1)
+    with Children(d, 1):
+        d.putSubItem("data", i)
+
+def qdump__std____1__unique_ptr(d, value):
+    i = d.childAt(d.childAt(value["__ptr_"], 0), 0)
+    if d.isNull(i):
+        d.putValue("(null)")
+        d.putNumChild(0)
+        return
+
+    if d.isSimpleType(d.templateArgument(value.type, 0)):
+        d.putValue("%s @0x%x" % (i.dereference().value, d.pointerValue(i)))
+    else:
+        d.putValue("@0x%x" % d.pointerValue(i))
+
+    d.putNumChild(1)
+    with Children(d, 1):
+        d.putSubItem("data", i.dereference())
+
+
+def qform__std__unordered_map():
+    return mapForms()
+
+def qform__std____debug__unordered_map():
+    return mapForms()
+
+def qdump__std__unordered_map(d, value):
+    try:
+        size = value["_M_element_count"]
+        start = value["_M_before_begin"]["_M_nxt"]
+    except:
+        size = value["_M_h"]["_M_element_count"]
+        start = value["_M_h"]["_M_bbegin"]["_M_node"]["_M_nxt"]
+    d.putItemCount(size)
+    d.putNumChild(size)
+    if d.isExpanded():
+        p = d.pointerValue(start)
+        keyType = d.templateArgument(value.type, 0)
+        valueType = d.templateArgument(value.type, 1)
+        allocatorType = d.templateArgument(value.type, 4)
+        pairType = d.templateArgument(allocatorType, 0)
+        ptrSize = d.ptrSize()
+        if d.isMapCompact(keyType, valueType):
+            with Children(d, size, childType=valueType):
+                for i in d.childRange():
+                    pair = d.createValue(p + ptrSize, pairType)
+                    with SubItem(d, i):
+                        d.putField("iname", d.currentIName)
+                        d.putName("[%s] %s" % (i, pair["first"]))
+                        d.putValue(pair["second"])
+                    p = d.dereference(p)
+        else:
+            with Children(d, size, childType=pairType):
+                for i in d.childRange():
+                    d.putSubItem(i, d.createValue(p + ptrSize, pairType))
+                    p = d.dereference(p)
+
+def qdump__std____debug__unordered_map(d, value):
+    qdump__std__unordered_map(d, value)
+
+def qdump__std__unordered_set(d, value):
+    try:
+        size = value["_M_element_count"]
+        start = value["_M_before_begin"]["_M_nxt"]
+    except:
+        size = value["_M_h"]["_M_element_count"]
+        start = value["_M_h"]["_M_bbegin"]["_M_node"]["_M_nxt"]
+    d.putItemCount(size)
+    d.putNumChild(size)
+    if d.isExpanded():
+        p = d.pointerValue(start)
+        valueType = d.templateArgument(value.type, 0)
+        with Children(d, size, childType=valueType):
+            ptrSize = d.ptrSize()
+            for i in d.childRange():
+                d.putSubItem(i, d.createValue(p + ptrSize, valueType))
+                p = d.dereference(p)
+
+def qdump__std____debug__unordered_set(d, value):
+    qdump__std__unordered_set(d, value)
+
+
+def qedit__std__vector(expr, value):
+    values = value.split(',')
+    n = len(values)
+    ob = gdb.parse_and_eval(expr)
+    innerType = d.templateArgument(ob.type, 0)
+    cmd = "set $d = (%s*)calloc(sizeof(%s)*%s,1)" % (innerType, innerType, n)
+    gdb.execute(cmd)
+    cmd = "set {void*[3]}%s = {$d, $d+%s, $d+%s}" % (ob.address, n, n)
+    gdb.execute(cmd)
+    cmd = "set (%s[%d])*$d={%s}" % (innerType, n, value)
+    gdb.execute(cmd)
+
+def qdump__std__vector(d, value):
+    impl = value["_M_impl"]
+    type = d.templateArgument(value.type, 0)
+    alloc = impl["_M_end_of_storage"]
+    isBool = str(type) == 'bool'
+    if isBool:
+        start = impl["_M_start"]["_M_p"]
+        finish = impl["_M_finish"]["_M_p"]
+        # FIXME: 8 is CHAR_BIT
+        storage = d.lookupType("unsigned long")
+        storagesize = storage.sizeof * 8
+        size = (finish - start) * storagesize
+        size += impl["_M_finish"]["_M_offset"]
+        size -= impl["_M_start"]["_M_offset"]
+    else:
+        start = impl["_M_start"]
+        finish = impl["_M_finish"]
+        size = finish - start
+
+    d.check(0 <= size and size <= 1000 * 1000 * 1000)
+    d.check(finish <= alloc)
+    d.checkPointer(start)
+    d.checkPointer(finish)
+    d.checkPointer(alloc)
+
+    d.putItemCount(size)
+    d.putNumChild(size)
+    if d.isExpanded():
+        if isBool:
+            with Children(d, size, maxNumChild=10000, childType=type):
+                for i in d.childRange():
+                    q = start + int(i / storagesize)
+                    d.putBoolItem(str(i), (q.dereference() >> (i % storagesize)) & 1)
+        else:
+            d.putArrayData(type, start, size)
+
+def qdump__std____1__vector(d, value):
+    innerType = d.templateArgument(value.type, 0)
+    if d.isLldb and d.childAt(value, 0).type == innerType:
+        # That's old lldb automatically formatting
+        begin = d.dereferenceValue(value)
+        size = value.GetNumChildren()
+    else:
+        # Normal case
+        begin = d.pointerValue(value['__begin_'])
+        end = d.pointerValue(value['__end_'])
+        size = (end - begin) / innerType.sizeof
+
+    d.putItemCount(size)
+    d.putNumChild(size)
+    if d.isExpanded():
+        d.putArrayData(innerType, begin, size)
+
+
+def qdump__std____debug__vector(d, value):
+    qdump__std__vector(d, value)
+
+def qedit__std__string(expr, value):
+    cmd = "print (%s).assign(\"%s\")" % (expr, value)
+    gdb.execute(cmd)
+
+def qedit__string(expr, value):
+    qedit__std__string(expr, value)
+
+def qdump__string(d, value):
+    qdump__std__string(d, value)
+
+def qdump__std__wstring(d, value):
+    charSize = d.lookupType('wchar_t').sizeof
+    qdump__std__stringHelper1(d, value, charSize)
+
+def qdump__std__basic_string(d, value):
+    innerType = d.templateArgument(value.type, 0)
+    qdump__std__stringHelper1(d, value, innerType.sizeof)
+
+def qdump__wstring(d, value):
+    qdump__std__wstring(d, value)
+
+
+def qdump____gnu_cxx__hash_set(d, value):
+    ht = value["_M_ht"]
+    size = int(ht["_M_num_elements"])
+    d.check(0 <= size and size <= 1000 * 1000 * 1000)
+    d.putItemCount(size)
+    d.putNumChild(size)
+    type = d.templateArgument(value.type, 0)
+    d.putType("__gnu__cxx::hash_set<%s>" % type)
+    if d.isExpanded():
+        with Children(d, size, maxNumChild=1000, childType=type):
+            buckets = ht["_M_buckets"]["_M_impl"]
+            bucketStart = buckets["_M_start"]
+            bucketFinish = buckets["_M_finish"]
+            p = bucketStart
+            itemCount = 0
+            for i in xrange(toInteger(bucketFinish - bucketStart)):
+                if not d.isNull(p.dereference()):
+                    cur = p.dereference()
+                    while not d.isNull(cur):
+                        with SubItem(d, itemCount):
+                            d.putValue(cur["_M_val"])
+                            cur = cur["_M_next"]
+                            itemCount += 1
+                p = p + 1
+
+
+def qdump__uint8_t(d, value):
+    d.putNumChild(0)
+    d.putValue(int(value))
+
+def qdump__int8_t(d, value):
+    d.putNumChild(0)
+    d.putValue(int(value))
+