diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..f5dc2a2
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,38 @@
+# .clang-format
+
+# 风格格式化
+BasedOnStyle: LLVM
+# 4 空格缩进
+IndentWidth: 4
+# 连续对齐变量的声明
+AlignConsecutiveDeclarations: true
+# 指针左侧对齐
+PointerAlignment: Left
+# 访问说明符(public、private等)的偏移
+AccessModifierOffset: -4
+# 大括号
+BreakBeforeBraces: Custom
+BraceWrapping:
+ # 函数定义后面大括号在新行
+ AfterFunction: true
+ # class定义后面
+ AfterClass: true
+
+# 去除C++11的列表初始化的大括号{后和}前的空格
+Cpp11BracedListStyle: true
+# 允许重新排版注释
+ReflowComments: true
+# 允许排序#include
+SortIncludes: false
+# 在尾随的评论前添加的空格数(只适用于//)
+SpacesBeforeTrailingComments: 3
+# tab宽度
+TabWidth: 4
+# 构造函数的初始化列表要么都在同一行,要么都各自一行
+ConstructorInitializerAllOnOneLineOrOnePerLine: true
+# 每行字符的限制,0表示没有限制
+ColumnLimit: 150
+# 允许短的块放在同一行
+AllowShortBlocksOnASingleLine: false
+# 是否允许短函数在一行
+AllowShortFunctionsOnASingleLine: InlineOnly
\ No newline at end of file
diff --git a/.vscode/qt5.natvis b/.vscode/qt5.natvis
new file mode 100644
index 0000000..7d18567
--- /dev/null
+++ b/.vscode/qt5.natvis
@@ -0,0 +1,814 @@
+
+
+
+
+
+
+ {{{data1,Xb}-{data2,Xb}-{data3,Xb}-{(data4[0]),nvoXb}{(data4[1]),nvoXb}-{(data4[2]),nvoXb}{(data4[3]),nvoXb}{(data4[4]),nvoXb}{(data4[5]),nvoXb}{(data4[6]),nvoXb}{(data4[7]),nvoXb}}}
+
+
+
+
+ {{ x = {xp}, y = {yp} }}
+
+ - xp
+ - yp
+
+
+
+
+ {{ x = {x1}, y = {y1}, width = {x2 - x1 + 1}, height = {y2 - y1 + 1} }}
+
+ - x1
+ - y1
+ - x2 - x1 + 1
+ - y2 - y1 + 1
+
+
+
+
+ {{ x = {xp}, y = {yp}, width = {w}, height = {h} }}
+
+ - xp
+ - yp
+ - w
+ - h
+
+
+
+
+
+ {{ width = {wd}, height = {ht} }}
+
+ - wd
+ - ht
+
+
+
+
+
+ {{ start point = {pt1}, end point = {pt2} }}
+
+
+ {pt1}
+
+ pt1
+
+
+
+ {pt2}
+
+ pt2
+
+
+
+
+
+
+
+ {{ size = {d->size} }}
+
+ - d->ref.atomic._q_value
+
+ d->size
+ (QPoint*)((reinterpret_cast<char*>(d)) + d->offset)
+
+
+
+
+
+ {{ size = {d->size} }}
+
+ -
+ d->size > 0
+ && ((((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[0]).xp
+ == (((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[d->size - 1]).xp)
+ && ((((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[0]).yp
+ == (((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[d->size - 1]).yp)
+
+ - d->ref.atomic._q_value
+
+ d->size
+ (QPointF*)((reinterpret_cast<char*>(d)) + d->offset)
+
+
+
+
+
+ {{ x = {xp}, y = {yp} }}
+
+ - xp
+ - yp
+
+
+
+
+ {{ x = {xp}, y = {yp}, z = {zp} }}
+
+ - xp
+ - yp
+ - zp
+
+
+
+
+ {{ x = {xp}, y = {yp}, z = {zp}, w = {wp} }}
+
+ - xp
+ - yp
+ - zp
+ - wp
+
+
+
+
+
+ {{ m11 = {_m11}, m12 = {_m12}, m21 = {_m21}, m22 = {_m22}, ... }}
+
+
+ - _m11
+ - _m12
+ - _m21
+ - _m22
+ - _dx
+ - _dy
+
+
+
+
+
+ {{ m11 = {m[0][0]}, m12 = {m[1][0]}, m13 = {m[2][0]}, m14 = {m[3][0]}, ... }}
+
+
+ - m[0][0]
+ - m[1][0]
+ - m[2][0]
+ - m[3][0]
+ - m[0][1]
+ - m[1][1]
+ - m[2][1]
+ - m[3][1]
+ - m[0][2]
+ - m[1][2]
+ - m[2][2]
+ - m[3][2]
+ - m[0][3]
+ - m[1][3]
+ - m[2][3]
+ - m[3][3]
+
+
+
+
+
+ {{ horizontal = {static_cast<Policy>(bits.horPolicy)}, vertical = {static_cast<Policy>(bits.verPolicy)}, type = {ControlType(1 << bits.ctype)} }}
+
+
+
+ QSizePolicy::Policy::{static_cast<Policy>(bits.verPolicy)}
+
+
+ QSizePolicy::Policy::{static_cast<Policy>(bits.horPolicy)}
+
+
+ QSizePolicy::ControlType::{ControlType(1 << bits.ctype)}
+
+
+
+ Qt::Vertical (2)
+
+
+ Qt::Horizontal (1)
+
+
+ - static_cast<int>(bits.verStretch)
+ - static_cast<int>(bits.horStretch)
+ - bits.hfw == 1
+ - bits.wfh == 1
+
+
+
+
+ {ucs,c}
+ ucs,c
+
+ - ucs > 0xff ? '\0' : char(ucs),c
+ - ucs,c
+
+
+
+
+ {((reinterpret_cast<unsigned short*>(d)) + d->offset / 2),sub}
+ ((reinterpret_cast<unsigned short*>(d)) + d->offset / 2),sub
+
+ - d->size
+ - d->ref.atomic._q_value
+
+ d->size
+ ((reinterpret_cast<unsigned short*>(d)) + d->offset / 2),c
+
+
+
+
+
+
+ {m_string,[m_size]} u""
+ {offset() + m_position,[m_size]}
+
+ - m_position
+ - m_size
+
+ m_size
+ offset()+m_position
+
+
+
+
+
+ {m_data,[m_size]}
+ m_data,[m_size]
+
+ - m_size
+
+ m_size
+ m_data
+
+
+
+
+
+ {((reinterpret_cast<char*>(d)) + d->offset),sb}
+ ((reinterpret_cast<char*>(d)) + d->offset),sb
+
+ - d->size
+ - d->ref.atomic._q_value
+
+ d->size
+ ((reinterpret_cast<char*>(d)) + d->offset),c
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {scheme()}://{host()}{path()}
+ {path()}
+
+ - scheme()
+ - username()
+ - password()
+ - host()
+ - path()
+ - query()
+ - fragment()
+
+
+
+
+ {{ size = {(d.d->size << 3) - *((reinterpret_cast<char*>(d.d)) + d.d->offset)} }}
+
+ - d.d->ref.atomic._q_value
+
+ (d.d->size << 3) - *((reinterpret_cast<char*>(d.d)) + d.d->offset)
+
+ (*(reinterpret_cast<const unsigned char*>((reinterpret_cast<char*>(d.d)) + d.d->offset) + 1
+ + ($i >> 3)) & (1 << ($i & 7))) != 0
+
+
+
+
+
+
+
+ {{ size = {s} }}
+
+ - a
+
+ s
+ ptr
+
+
+
+
+
+ {{ julian day = {jd} }}
+
+
+
+
+ {{ millisecond = {mds} }}
+ {{ milliseconds = {mds} }}
+
+ - mds / 3600000, d
+ - mds / 3600000, d
+ - (mds % 3600000) / 60000, d
+ - (mds % 3600000) / 60000, d
+ - (mds / 1000) % 60, d
+ - (mds / 1000) % 60, d
+ - mds % 1000, d
+ - mds % 1000, d
+
+
+
+
+ {d.pattern}
+
+
+
+
+ - ref._q_value
+
+
+
+
+ strong reference to shared pointer of type {"$T1"}
+
+ - value == 0
+ - d->weakref._q_value
+ - d->strongref._q_value
+
+
+
+
+ pointer to implicit shared object of type {"$T1"}
+
+ d
+
+
+
+
+ pointer to explicit shared object of type {"$T1"}
+
+ d
+
+
+
+
+ guarded pointer to subclass of QObject of type {"$T1"}
+
+ - wp.d == 0 || wp.d->strongref._q_value == 0 || wp.value == 0
+
+
+
+
+ weak reference to shared pointer of type {"$T1"}
+
+ - d == 0 || d->strongref._q_value == 0 || value == 0
+ - d->weakref._q_value
+ - d->strongref._q_value
+
+
+
+
+ scoped pointer to a dynamically allocated object of type {"$T1"}
+
+ - !d
+
+
+
+
+ scoped pointer to dynamically allocated array of objects of type {"$T1"}
+
+ - !d
+
+
+
+
+ ({first}, {second})
+
+ - first
+ - second
+
+
+
+
+
+ {{ size = {d->size} }}
+
+ - d->ref.atomic._q_value
+
+ d->size
+ ($T1*)((reinterpret_cast<char*>(d)) + d->offset)
+
+
+
+
+
+
+ {{ size = {d->end - d->begin} }}
+
+ - d->ref.atomic._q_value
+
+ d->end - d->begin
+ *reinterpret_cast<$T1*>((sizeof($T1) > sizeof(void*))
+ ? reinterpret_cast<Node*>(d->array + d->begin + $i)->v
+ : reinterpret_cast<$T1*>(d->array + d->begin + $i))
+
+
+
+
+
+
+ {{ size = {d->end - d->begin} }}
+
+ - d->ref.atomic._q_value
+
+ d->end - d->begin
+
+ *reinterpret_cast<QString*>((sizeof(QString) > sizeof(void*))
+ ? reinterpret_cast<Node*>(d->array + d->begin + $i)->v
+ : reinterpret_cast<QString*>(d->array + d->begin + $i))
+
+
+
+
+
+
+ {{ size = {d->end - d->begin} }}
+
+ - d->ref.atomic._q_value
+
+ d->end - d->begin
+
+ *reinterpret_cast<QVariant*>((sizeof(QVariant) > sizeof(void*))
+ ? reinterpret_cast<Node*>(d->array + d->begin + $i)->v
+ : reinterpret_cast<QVariant*>(d->array + d->begin + $i))
+
+
+
+
+
+
+ {{ size = {d->size} }}
+
+ - d->ref.atomic._q_value
+
+ d->size
+ d->n
+ n
+ (*(QLinkedListNode<$T1>*)this).t
+
+
+
+
+
+ ({key}, {value})
+
+ - key
+ - value
+
+
+
+
+
+ {{ size = {d->size} }}
+
+ - d->ref.atomic._q_value
+
+ d->size
+ d->header.left
+ left
+ right
+ *((QMapNode<$T1,$T2>*)this)
+
+
+
+
+
+ (empty)
+ ({key}, {value})
+
+ - key
+ - value
+ - next
+
+
+
+
+
+ {{ size = {d->size} }}
+
+
+ d->numBuckets
+ reinterpret_cast<Node **>(d->buckets)
+
+
+
+
+
+
+ d->size
+
+
+ node = *(bucket++)
+ --n
+
+
+ keyValuePair = reinterpret_cast<Node *>(node)
+ - keyValuePair->value
+ node = node->next
+
+
+
+
+
+
+
+ (empty)
+ ({key})
+
+ - key
+
+
+
+
+ {{ size = {q_hash.d->size} }}
+
+ q_hash
+
+
+
+
+ ({*keyPtr}, {*t})
+
+ - *keyPtr
+ - *t
+
+
+
+
+ {{ size = {hash.d->size} }}
+
+ - mx
+ - total
+ - hash.d->ref.atomic._q_value
+
+ hash.d->size
+ f
+ n
+ *((Node*)this)
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row count = {(*d_ptr.d).rows()}, column count = {(*d_ptr.d).columns()} }}
+
+ - d_ptr.d,!
+ - (*d_ptr.d).rows()
+ - (*d_ptr.d).columns()
+
+
+
+
+
+
+ Invalid
+ {d.data.b}
+ {d.data.i}
+ {d.data.u}
+ {d.data.ll}
+ {d.data.ull}
+ {d.data.d}
+ {d.data.c}
+
+ {*((QMap<QString,QVariant>*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+
+ {*((QList<QVariant>*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+
+ {*((QString*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+
+ {*((QStringList*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+
+ {*((QByteArray*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+
+ {*((QBitArray*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+
+ {*((QDate*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+
+ {*((QTime*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+ DateTime
+ Url
+ Locale
+
+ {*((QRect*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+
+ {*((QRectF*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+
+ {*((QSize*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+
+ {*((QSizeF*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+
+ {*((QLine*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+
+ {*((QLineF*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+
+ {*((QPoint*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+
+ {*((QPointF*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+ RegExp
+ RegularExpression
+
+ {*((QHash<QString,QVariant>*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))}
+
+ EasingCurve
+ Uuid
+ ModelIndex
+ LastCoreType
+ Font
+ Pixmap
+ Brush
+ Color
+ Palette
+ Image
+ Polygon
+ Region
+ Bitmap
+ Cursor
+ KeySequence
+ Pen
+ TextLength
+ TextFormat
+ Matrix
+ Transform
+ Matrix4x4
+ Vector2D
+ Vector3D
+ Vector4D
+ Quaternion
+ PolygonF
+ Icon
+ LastGuiType
+ SizePolicy
+ UserType
+ LastType
+
+
+
+
+
+ d.data.c
+
+
+ *((QString*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+
+ *((QByteArray*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+
+
+
+
+
+
+ *((QMap<QString,QVariant>*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QList<QVariant>*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QString*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QStringList*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QByteArray*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QBitArray*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QDate*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QTime*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QRect*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QRectF*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QSize*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QSizeF*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QLine*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QLineF*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QPoint*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QPointF*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+ *((QHash<QString,QVariant>*)(d.is_shared ? d.data.shared->ptr
+ : reinterpret_cast<const void *>(&d.data.ptr)))
+
+
+
+
+
+
+
diff --git a/.vscode/qt6.natvis b/.vscode/qt6.natvis
new file mode 100644
index 0000000..94c2260
--- /dev/null
+++ b/.vscode/qt6.natvis
@@ -0,0 +1,735 @@
+
+
+
+
+
+
+ {val}
+
+ - val
+
+
+
+
+
+
+
+ {{ x = {x,g}, y = {y,g}, z = {_extraData().z,g}, width = {width,g}, height = {height,g} }}
+ {{ x = {x,g}, y = {y,g}, width = {width,g}, height = {height,g} }}
+
+ - x
+ - y
+ - _extraData().z
+ - _extraData().scale
+ - _extraData().rotation
+ - _extraData().opacity
+ - width
+ - height
+ - implicitWidth
+ - implicitHeight
+ - effectiveVisible
+ - explicitEnable
+ - _objectName(),na
+ - parentItem
+ - childItems, nr
+
+
+
+
+ {d_ptr.d,na}
+
+ d_ptr.d
+
+
+
+
+ {{{data1,Xb}-{data2,Xb}-{data3,Xb}-{(data4[0]),nvoXb}{(data4[1]),nvoXb}-{(data4[2]),nvoXb}{(data4[3]),nvoXb}{(data4[4]),nvoXb}{(data4[5]),nvoXb}{(data4[6]),nvoXb}{(data4[7]),nvoXb}}}
+
+
+
+ {val}
+
+ - val
+
+
+
+
+ {_q_value}
+
+ - _q_value
+
+
+
+
+
+
+ empty
+ {_q_value}
+
+ - *value()
+
+
+
+
+
+ {{ x = {xp}, y = {yp} }}
+
+ - xp
+ - yp
+
+
+
+
+ {{ x = {x1}, y = {y1}, width = {x2 - x1 + 1}, height = {y2 - y1 + 1} }}
+
+ - x1
+ - y1
+ - x2 - x1 + 1
+ - y2 - y1 + 1
+
+
+
+
+ {{ x = {xp}, y = {yp}, width = {w}, height = {h} }}
+
+ - xp
+ - yp
+ - w
+ - h
+
+
+
+
+
+ {{ width = {wd}, height = {ht} }}
+
+ - wd
+ - ht
+
+
+
+
+
+ {{ start point = {pt1}, end point = {pt2} }}
+
+
+ {pt1}
+
+ pt1
+
+
+
+ {pt2}
+
+ pt2
+
+
+
+
+
+
+
+ {{ size={d->size} }}
+
+ - d->ref.atomic._q_value
+
+ d->size
+ (QPoint*)((reinterpret_cast<char*>(d)) + d->offset)
+
+
+
+
+
+ {{ size={d->size} }}
+
+ -
+ d->size > 0
+ && ((((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[0]).xp
+ == (((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[d->size - 1]).xp)
+ && ((((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[0]).yp
+ == (((QPointF*)((reinterpret_cast<char*>(d)) + d->offset)[d->size - 1]).yp)
+
+ - d->ref.atomic._q_value
+
+ d->size
+ (QPointF*)((reinterpret_cast<char*>(d)) + d->offset)
+
+
+
+
+
+ {{ x = {xp}, y = {yp} }}
+
+ - xp
+ - yp
+
+
+
+
+ {{ x = {xp}, y = {yp}, z = {zp} }}
+
+ - xp
+ - yp
+ - zp
+
+
+
+
+ {{ x = {xp}, y = {yp}, z = {zp}, w = {wp} }}
+
+ - xp
+ - yp
+ - zp
+ - wp
+
+
+
+
+
+ {{ m11 = {_m11}, m12 = {_m12}, m21 = {_m21}, m22 = {_m22}, ... }}
+
+
+ - _m11
+ - _m12
+ - _m21
+ - _m22
+ - _dx
+ - _dy
+
+
+
+
+
+ {{ m11 = {m[0][0]}, m12 = {m[1][0]}, m13 = {m[2][0]}, m14 = {m[3][0]}, ... }}
+
+
+ - m[0][0]
+ - m[1][0]
+ - m[2][0]
+ - m[3][0]
+ - m[0][1]
+ - m[1][1]
+ - m[2][1]
+ - m[3][1]
+ - m[0][2]
+ - m[1][2]
+ - m[2][2]
+ - m[3][2]
+ - m[0][3]
+ - m[1][3]
+ - m[2][3]
+ - m[3][3]
+
+
+
+
+
+ {{ horizontal = {static_cast<Policy>(bits.horPolicy)}, vertical = {static_cast<Policy>(bits.verPolicy)}, type = {ControlType(1 << bits.ctype)} }}
+
+
+
+ QSizePolicy::Policy::{static_cast<Policy>(bits.verPolicy)}
+
+
+ QSizePolicy::Policy::{static_cast<Policy>(bits.horPolicy)}
+
+
+ QSizePolicy::ControlType::{ControlType(1 << bits.ctype)}
+
+
+
+ Qt::Vertical (2)
+
+
+ Qt::Horizontal (1)
+
+
+ - static_cast<int>(bits.verStretch)
+ - static_cast<int>(bits.horStretch)
+ - bits.hfw == 1
+ - bits.wfh == 1
+
+
+
+
+ {ucs,c}
+ ucs,c
+
+ - ucs > 0xff ? '\0' : char(ucs),c
+ - ucs,c
+
+
+
+
+ "{(reinterpret_cast<unsigned short*>(d.ptr)),sub}"
+ (reinterpret_cast<unsigned short*>(d.ptr)),sub
+
+ - d.size
+
+ d.size
+ d.ptr
+
+
+
+
+
+ {m_string,[m_size]} u""
+ {m_string->d.ptr+m_position,[m_size]}
+ ""
+ m_string,[m_position+m_size]
+
+ - m_position
+ - m_size
+
+ m_size
+ m_string->d.ptr+m_position
+
+
+
+
+
+ {m_data,[m_size]}
+ m_data,[m_size]
+
+ - m_size
+
+ m_size
+ m_data
+
+
+
+
+
+ "{((reinterpret_cast<char*>(d.ptr))),sb}"
+ ((reinterpret_cast<char*>(d.ptr))),sb
+
+ - d.size
+
+ d.size
+ d.ptr
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {scheme()}://{host()}{path()}
+ {path()}
+
+ - scheme()
+ - username()
+ - password()
+ - host()
+ - path()
+ - query()
+ - fragment()
+
+
+
+
+ {{ julian day = {jd} }}
+
+
+
+
+
+
+
+ {{ millisecond = {mds} }}
+ {{ milliseconds = {mds} }}
+
+ - hour(), d
+ - hour(), d
+ - minute(), d
+ - minute(), d
+ - second(), d
+ - second(), d
+ - millisecond(), d
+ - millisecond(), d
+
+
+
+
+ ({first}, {second})
+
+ - first
+ - second
+
+
+
+
+
+ {{ size={d.size} }}
+
+
+ d.size
+ reinterpret_cast<$T1*>(d.ptr)
+
+
+
+
+
+ {{ size={s} }}
+
+ - a
+
+ s
+ ptr
+
+
+
+
+
+
+ {{ size={d.d->m._Mypair._Myval2._Myval2._Mysize} }}
+
+
+ d.d->m._Mypair._Myval2._Myval2._Mysize
+ d.d->m._Mypair._Myval2._Myval2._Myhead->_Parent
+ _Left
+ _Right
+ _Myval,view(MapHelper)
+
+
+
+
+
+ {second}
+
+
+
+ {value}
+
+ - key
+ - value
+
+
+
+
+ {value->value}
+ ({value->value}, {value->next->value})
+ ({value->value}, {value->next->value}, ...)
+
+
+ value
+ next
+ value
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ size={d->size} }}
+
+
+
+
+ d->size
+
+
+ - getNode(iSpan, 0)
+ - getNode(iSpan, 1)
+ - getNode(iSpan, 2)
+ - getNode(iSpan, 3)
+ - getNode(iSpan, 4)
+ - getNode(iSpan, 5)
+ - getNode(iSpan, 6)
+ - getNode(iSpan, 7)
+ - getNode(iSpan, 8)
+ - getNode(iSpan, 9)
+ - getNode(iSpan, 10)
+ - getNode(iSpan, 11)
+ - getNode(iSpan, 12)
+ - getNode(iSpan, 13)
+ - getNode(iSpan, 14)
+ - getNode(iSpan, 15)
+ - getNode(iSpan, 16)
+ - getNode(iSpan, 17)
+ - getNode(iSpan, 18)
+ - getNode(iSpan, 19)
+ - getNode(iSpan, 20)
+ - getNode(iSpan, 21)
+ - getNode(iSpan, 22)
+ - getNode(iSpan, 23)
+ - getNode(iSpan, 24)
+ - getNode(iSpan, 25)
+ - getNode(iSpan, 26)
+ - getNode(iSpan, 27)
+ - getNode(iSpan, 28)
+ - getNode(iSpan, 29)
+ - getNode(iSpan, 30)
+ - getNode(iSpan, 31)
+ - getNode(iSpan, 32)
+ - getNode(iSpan, 33)
+ - getNode(iSpan, 34)
+ - getNode(iSpan, 35)
+ - getNode(iSpan, 36)
+ - getNode(iSpan, 37)
+ - getNode(iSpan, 38)
+ - getNode(iSpan, 39)
+ - getNode(iSpan, 40)
+ - getNode(iSpan, 41)
+ - getNode(iSpan, 42)
+ - getNode(iSpan, 43)
+ - getNode(iSpan, 44)
+ - getNode(iSpan, 45)
+ - getNode(iSpan, 46)
+ - getNode(iSpan, 47)
+ - getNode(iSpan, 48)
+ - getNode(iSpan, 49)
+ - getNode(iSpan, 50)
+ - getNode(iSpan, 51)
+ - getNode(iSpan, 52)
+ - getNode(iSpan, 53)
+ - getNode(iSpan, 54)
+ - getNode(iSpan, 55)
+ - getNode(iSpan, 56)
+ - getNode(iSpan, 57)
+ - getNode(iSpan, 58)
+ - getNode(iSpan, 59)
+ - getNode(iSpan, 60)
+ - getNode(iSpan, 61)
+ - getNode(iSpan, 62)
+ - getNode(iSpan, 63)
+ - getNode(iSpan, 64)
+ - getNode(iSpan, 65)
+ - getNode(iSpan, 66)
+ - getNode(iSpan, 67)
+ - getNode(iSpan, 68)
+ - getNode(iSpan, 69)
+ - getNode(iSpan, 70)
+ - getNode(iSpan, 71)
+ - getNode(iSpan, 72)
+ - getNode(iSpan, 73)
+ - getNode(iSpan, 74)
+ - getNode(iSpan, 75)
+ - getNode(iSpan, 76)
+ - getNode(iSpan, 77)
+ - getNode(iSpan, 78)
+ - getNode(iSpan, 79)
+ - getNode(iSpan, 80)
+ - getNode(iSpan, 81)
+ - getNode(iSpan, 82)
+ - getNode(iSpan, 83)
+ - getNode(iSpan, 84)
+ - getNode(iSpan, 85)
+ - getNode(iSpan, 86)
+ - getNode(iSpan, 87)
+ - getNode(iSpan, 88)
+ - getNode(iSpan, 89)
+ - getNode(iSpan, 90)
+ - getNode(iSpan, 91)
+ - getNode(iSpan, 92)
+ - getNode(iSpan, 93)
+ - getNode(iSpan, 94)
+ - getNode(iSpan, 95)
+ - getNode(iSpan, 96)
+ - getNode(iSpan, 97)
+ - getNode(iSpan, 98)
+ - getNode(iSpan, 99)
+ - getNode(iSpan, 100)
+ - getNode(iSpan, 101)
+ - getNode(iSpan, 102)
+ - getNode(iSpan, 103)
+ - getNode(iSpan, 104)
+ - getNode(iSpan, 105)
+ - getNode(iSpan, 106)
+ - getNode(iSpan, 107)
+ - getNode(iSpan, 108)
+ - getNode(iSpan, 109)
+ - getNode(iSpan, 110)
+ - getNode(iSpan, 111)
+ - getNode(iSpan, 112)
+ - getNode(iSpan, 113)
+ - getNode(iSpan, 114)
+ - getNode(iSpan, 115)
+ - getNode(iSpan, 116)
+ - getNode(iSpan, 117)
+ - getNode(iSpan, 118)
+ - getNode(iSpan, 119)
+ - getNode(iSpan, 120)
+ - getNode(iSpan, 121)
+ - getNode(iSpan, 122)
+ - getNode(iSpan, 123)
+ - getNode(iSpan, 124)
+ - getNode(iSpan, 125)
+ - getNode(iSpan, 126)
+ - getNode(iSpan, 127)
+ iSpan++
+
+
+
+
+
+
+
+ {{ size={q_hash.d->size} }}
+
+ q_hash
+
+
+
+
+
+
+
+
+
+
+
+ (null)
+
+
+ QObject*
+
+
+ {*(QMap<QString,QVariant>*) sharedDataStar()}
+ {*(QList<QVariant>*) sharedDataStar()}
+ {*(QHash<QString,QVariant>*) sharedDataStar()}
+ QVariantPair
+ {*(QList<QByteArray>*) sharedDataStar()}
+ {*(QList<QString>*) sharedDataStar()}
+
+
+ {*(bool*) dataStar()}
+ {*(int*) dataStar()}
+ {*(unsigned int*) dataStar()}
+ {*(long long*) dataStar()}
+ {*(unsigned long long*) dataStar()}
+ {*(double*) dataStar()}
+ {*(void**) dataStar()}
+ {*(long*) dataStar()}
+ {*(short*) dataStar()}
+ {*(char*) dataStar()}
+ {*(char16_t*) dataStar()}
+ {*(char32_t*) dataStar()}
+ {*(unsigned long*) dataStar()}
+ {*(unsigned short*) dataStar()}
+ {*(unsigned char*) dataStar()}
+ {*(float*) dataStar()}
+ {*(signed char*) dataStar()}
+
+
+ {*(QChar*) sharedDataStar()}
+ {*(QString*) sharedDataStar()}
+ {*(QByteArray*) sharedDataStar()}
+ {*(QDate*) sharedDataStar()}
+ {*(QTime*) sharedDataStar()}
+ QDateTime
+ QUrl
+ QLocale
+ {*(QRect*) sharedDataStar()}
+ {*(QRectF*) sharedDataStar()}
+ {*(QSize*) sharedDataStar()}
+ {*(QSizeF*) sharedDataStar()}
+ {*(QLine*) sharedDataStar()}
+ {*(QLineF*) sharedDataStar()}
+ {*(QPoint*) sharedDataStar()}
+ {*(QPointF*) sharedDataStar()}
+ EasingCurve
+ Uuid
+ RegularExpression
+ QJsonValue
+ QJsonObject
+ QJsonArray
+ QJsonDocument
+ QCborValue
+ QCborArray
+ QCborMap
+ ModelIndex
+ QPersistentModelIndex
+
+
+ QFont
+ QPixmap
+ QBrush
+ QColor
+ QPalette
+ QIcon
+ QImage
+ QPolygon
+ QRegion
+ QBitmap
+ QCursor
+ QKeySequence
+ QPen
+ QTextLength
+ QTextFormat
+ QTransform
+ QMatrix4x4
+ QVector2D
+ QVector3D
+ QVector4D
+ QQuaternion
+ QPolygonF
+ QColorSpace
+
+
+ QSizePolicy
+
+
+ QMetaType::Type ({typeId()})
+
+
+ *(QString*) sharedDataStar()
+ *(QByteArray*) sharedDataStar()
+ *(QDate*) sharedDataStar()
+ *(QTime*) sharedDataStar()
+ *(QRect*) sharedDataStar()
+ *(QRectF*) sharedDataStar()
+ *(QSize*) sharedDataStar()
+ *(QSizeF*) sharedDataStar()
+ *(QLine*) sharedDataStar()
+ *(QLineF*) sharedDataStar()
+ *(QPoint*) sharedDataStar()
+ *(QPointF*) sharedDataStar()
+
+ *(QMap<QString,QVariant>*) sharedDataStar()
+ *(QList<QVariant>*) sharedDataStar()
+ *(QHash<QString,QVariant>*) sharedDataStar()
+ *(QList<QByteArray>*) sharedDataStar()
+ *(QList<QString>*) sharedDataStar()
+
+
+
+
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 71bf90f..35b41b6 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -31,5 +31,71 @@
"ja": true,
"zh-hant": true,
"zh-hans": true
+ },
+ "files.associations": {
+ "algorithm": "cpp",
+ "atomic": "cpp",
+ "cctype": "cpp",
+ "chrono": "cpp",
+ "cmath": "cpp",
+ "cstdarg": "cpp",
+ "cstddef": "cpp",
+ "cstdint": "cpp",
+ "cstdio": "cpp",
+ "cstdlib": "cpp",
+ "cstring": "cpp",
+ "ctime": "cpp",
+ "cwchar": "cpp",
+ "exception": "cpp",
+ "filesystem": "cpp",
+ "functional": "cpp",
+ "initializer_list": "cpp",
+ "iomanip": "cpp",
+ "ios": "cpp",
+ "iosfwd": "cpp",
+ "iostream": "cpp",
+ "istream": "cpp",
+ "iterator": "cpp",
+ "limits": "cpp",
+ "list": "cpp",
+ "locale": "cpp",
+ "map": "cpp",
+ "memory": "cpp",
+ "mutex": "cpp",
+ "new": "cpp",
+ "numeric": "cpp",
+ "ostream": "cpp",
+ "ratio": "cpp",
+ "stdexcept": "cpp",
+ "streambuf": "cpp",
+ "string": "cpp",
+ "string_view": "cpp",
+ "system_error": "cpp",
+ "thread": "cpp",
+ "tuple": "cpp",
+ "type_traits": "cpp",
+ "typeinfo": "cpp",
+ "unordered_map": "cpp",
+ "utility": "cpp",
+ "variant": "cpp",
+ "vector": "cpp",
+ "xfacet": "cpp",
+ "xhash": "cpp",
+ "xiosbase": "cpp",
+ "xlocale": "cpp",
+ "xlocbuf": "cpp",
+ "xlocinfo": "cpp",
+ "xlocmes": "cpp",
+ "xlocmon": "cpp",
+ "xlocnum": "cpp",
+ "xloctime": "cpp",
+ "xmemory": "cpp",
+ "xmemory0": "cpp",
+ "xstddef": "cpp",
+ "xstring": "cpp",
+ "xtr1common": "cpp",
+ "xtree": "cpp",
+ "xutility": "cpp",
+ "qtablewidget": "cpp"
}
}
\ No newline at end of file
diff --git a/3rd/SimpleIni.h b/3rd/SimpleIni.h
new file mode 100644
index 0000000..1f0c0ae
--- /dev/null
+++ b/3rd/SimpleIni.h
@@ -0,0 +1,3630 @@
+/** @mainpage
+
+
+ Library | SimpleIni
+ |
---|
File | SimpleIni.h
+ |
---|
Author | Brodie Thiesfield
+ |
---|
Source | https://github.com/brofield/simpleini
+ |
---|
Version | 4.22
+ |
---|
+
+ Jump to the @link CSimpleIniTempl CSimpleIni @endlink interface documentation.
+
+ @section intro INTRODUCTION
+
+ This component allows an INI-style configuration file to be used on both
+ Windows and Linux/Unix. It is fast, simple and source code using this
+ component will compile unchanged on either OS.
+
+ @section features FEATURES
+
+ - MIT Licence allows free use in all software (including GPL and commercial)
+ - multi-platform (Windows CE/9x/NT..10/etc, Linux, MacOSX, Unix)
+ - loading and saving of INI-style configuration files
+ - configuration files can have any newline format on all platforms
+ - liberal acceptance of file format
+ - key/values with no section
+ - removal of whitespace around sections, keys and values
+ - support for multi-line values (values with embedded newline characters)
+ - optional support for multiple keys with the same name
+ - optional case-insensitive sections and keys (for ASCII characters only)
+ - saves files with sections and keys in the same order as they were loaded
+ - preserves comments on the file, section and keys where possible.
+ - supports both char or wchar_t programming interfaces
+ - supports both MBCS (system locale) and UTF-8 file encodings
+ - system locale does not need to be UTF-8 on Linux/Unix to load UTF-8 file
+ - support for non-ASCII characters in section, keys, values and comments
+ - support for non-standard character types or file encodings
+ via user-written converter classes
+ - support for adding/modifying values programmatically
+ - should compile cleanly without warning usually at the strictest warning level
+ - it has been tested with the following compilers:
+ - Windows/VC6 (warning level 3)
+ - Windows/VC.NET 2003 (warning level 4)
+ - Windows/VC 2005 (warning level 4)
+ - Windows/VC 2019 (warning level 4)
+ - Linux/gcc (-Wall)
+ - Mac OS/c++ (-Wall)
+
+ @section usage USAGE SUMMARY
+
+ -# Decide if you will be using utf8 or MBCS files, and working with the
+ data in utf8, wchar_t or ICU chars.
+ -# If you will only be using straight utf8 files and access the data via the
+ char interface, then you do not need any conversion library and could define
+ SI_NO_CONVERSION. Note that no conversion also means no validation of the data.
+ If no converter is specified then the default converter is SI_CONVERT_GENERIC
+ on Mac/Linux and SI_CONVERT_WIN32 on Windows. If you need widechar support on
+ Mac/Linux then use either SI_CONVERT_GENERIC or SI_CONVERT_ICU. These are also
+ supported on all platforms.
+ -# Define the appropriate symbol for the converter you wish to use and
+ include the SimpleIni.h header file.
+ -# Declare an instance of the appropriate class. Note that the following
+ definitions are just shortcuts for commonly used types. Other types
+ (PRUnichar, unsigned short, unsigned char) are also possible.
+
+ Interface | Case-sensitive | Load UTF-8 | Load MBCS | Typedef
+ |
---|
SI_NO_CONVERSION
+ |
---|
char | No | Yes | No | CSimpleIniA
+ |
char | Yes | Yes | No | CSimpleIniCaseA
+ |
SI_CONVERT_GENERIC
+ |
---|
char | No | Yes | Yes #1 | CSimpleIniA
+ |
char | Yes | Yes | Yes | CSimpleIniCaseA
+ |
wchar_t | No | Yes | Yes | CSimpleIniW
+ |
wchar_t | Yes | Yes | Yes | CSimpleIniCaseW
+ |
SI_CONVERT_WIN32
+ |
---|
char | No | No #2 | Yes | CSimpleIniA
+ |
char | Yes | Yes | Yes | CSimpleIniCaseA
+ |
wchar_t | No | Yes | Yes | CSimpleIniW
+ |
wchar_t | Yes | Yes | Yes | CSimpleIniCaseW
+ |
SI_CONVERT_ICU
+ |
---|
char | No | Yes | Yes | CSimpleIniA
+ |
char | Yes | Yes | Yes | CSimpleIniCaseA
+ |
UChar | No | Yes | Yes | CSimpleIniW
+ |
UChar | Yes | Yes | Yes | CSimpleIniCaseW
+ |
+ #1 On Windows you are better to use CSimpleIniA with SI_CONVERT_WIN32.
+ #2 Only affects Windows. On Windows this uses MBCS functions and
+ so may fold case incorrectly leading to uncertain results.
+ -# Set all the options that you require, see all the Set*() options below.
+ The SetUnicode() option is very common and can be specified in the constructor.
+ -# Call LoadData() or LoadFile() to load and parse the INI configuration file
+ -# Access and modify the data of the file using the following functions
+
+ GetAllSections | Return all section names
+ |
GetAllKeys | Return all key names within a section
+ |
GetAllValues | Return all values within a section & key
+ |
GetSection | Return all key names and values in a section
+ |
GetSectionSize | Return the number of keys in a section
+ |
GetValue | Return a value for a section & key
+ |
SetValue | Add or update a value for a section & key
+ |
Delete | Remove a section, or a key from a section
+ |
SectionExists | Does a section exist?
+ |
KeyExists | Does a key exist?
+ |
+ -# Call Save() or SaveFile() to save the INI configuration data
+
+ @section iostreams IO STREAMS
+
+ SimpleIni supports reading from and writing to STL IO streams. Enable this
+ by defining SI_SUPPORT_IOSTREAMS before including the SimpleIni.h header
+ file. Ensure that if the streams are backed by a file (e.g. ifstream or
+ ofstream) then the flag ios_base::binary has been used when the file was
+ opened.
+
+ @section multiline MULTI-LINE VALUES
+
+ Values that span multiple lines are created using the following format.
+
+
+ key = <<
+
+ Note the following:
+ - The text used for ENDTAG can be anything and is used to find
+ where the multi-line text ends.
+ - The newline after ENDTAG in the start tag, and the newline
+ before ENDTAG in the end tag is not included in the data value.
+ - The ending tag must be on it's own line with no whitespace before
+ or after it.
+ - The multi-line value is modified at load so that each line in the value
+ is delimited by a single '\\n' character on all platforms. At save time
+ it will be converted into the newline format used by the current
+ platform.
+
+ @section comments COMMENTS
+
+ Comments are preserved in the file within the following restrictions:
+ - Every file may have a single "file comment". It must start with the
+ first character in the file, and will end with the first non-comment
+ line in the file.
+ - Every section may have a single "section comment". It will start
+ with the first comment line following the file comment, or the last
+ data entry. It ends at the beginning of the section.
+ - Every key may have a single "key comment". This comment will start
+ with the first comment line following the section start, or the file
+ comment if there is no section name.
+ - Comments are set at the time that the file, section or key is first
+ created. The only way to modify a comment on a section or a key is to
+ delete that entry and recreate it with the new comment. There is no
+ way to change the file comment.
+
+ @section save SAVE ORDER
+
+ The sections and keys are written out in the same order as they were
+ read in from the file. Sections and keys added to the data after the
+ file has been loaded will be added to the end of the file when it is
+ written. There is no way to specify the location of a section or key
+ other than in first-created, first-saved order.
+
+ @section notes NOTES
+
+ - To load UTF-8 data on Windows 95, you need to use Microsoft Layer for
+ Unicode, or SI_CONVERT_GENERIC, or SI_CONVERT_ICU.
+ - When using SI_CONVERT_GENERIC, ConvertUTF.c must be compiled and linked.
+ - When using SI_CONVERT_ICU, ICU header files must be on the include
+ path and icuuc.lib must be linked in.
+ - To load a UTF-8 file on Windows AND expose it with SI_CHAR == char,
+ you should use SI_CONVERT_GENERIC.
+ - The collation (sorting) order used for sections and keys returned from
+ iterators is NOT DEFINED. If collation order of the text is important
+ then it should be done yourself by either supplying a replacement
+ SI_STRLESS class, or by sorting the strings external to this library.
+ - Usage of the header on Windows can be disabled by defining
+ SI_NO_MBCS. This is defined automatically on Windows CE platforms.
+ - Not thread-safe so manage your own locking
+
+ @section contrib CONTRIBUTIONS
+
+ Many thanks to the following contributors:
+
+ - 2010/05/03: Tobias Gehrig: added GetDoubleValue()
+ - See list of many contributors in github
+
+ @section licence MIT LICENCE
+
+ The licence text below is the boilerplate "MIT Licence" used from:
+ http://www.opensource.org/licenses/mit-license.php
+
+ Copyright (c) 2006-2024, Brodie Thiesfield
+
+ 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 INCLUDED_SimpleIni_h
+#define INCLUDED_SimpleIni_h
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+// Disable these warnings in MSVC:
+// 4127 "conditional expression is constant" as the conversion classes trigger
+// it with the statement if (sizeof(SI_CHAR) == sizeof(char)). This test will
+// be optimized away in a release build.
+// 4503 'insert' : decorated name length exceeded, name was truncated
+// 4702 "unreachable code" as the MS STL header causes it in release mode.
+// Again, the code causing the warning will be cleaned up by the compiler.
+// 4786 "identifier truncated to 256 characters" as this is thrown hundreds
+// of times VC6 as soon as STL is used.
+#ifdef _MSC_VER
+# pragma warning (push)
+# pragma warning (disable: 4127 4503 4702 4786)
+#endif
+
+#include
+#include
+#include
+#include