8static void throwException(Tcl_Interp* interp)
10 std::string_view message = interp ? Tcl_GetStringResult(interp)
12 throw CommandException(message);
15static void unshare(Tcl_Obj*& obj)
17 if (Tcl_IsShared(obj)) {
18 Tcl_DecrRefCount(obj);
19 obj = Tcl_DuplicateObj(obj);
20 Tcl_IncrRefCount(obj);
34 Tcl_Interp* interp =
nullptr;
35 if (Tcl_ListObjAppendElement(interp, obj, element) != TCL_OK) {
36 throwException(interp);
40void TclObject::addListElementsImpl(std::initializer_list<Tcl_Obj*> l)
42 Tcl_Obj*
const* objv = l.begin();
43 addListElementsImpl(
int(l.size()), objv);
46void TclObject::addListElementsImpl(
int objc, Tcl_Obj*
const* objv)
49 Tcl_Interp* interp =
nullptr;
50 if (Tcl_ListObjReplace(interp, obj, INT_MAX, 0, objc, objv) != TCL_OK) {
51 throwException(interp);
57 assert((keyValuePairs.size() % 2) == 0);
59 Tcl_Interp* interp =
nullptr;
60 auto it = keyValuePairs.begin(), et = keyValuePairs.end();
63 Tcl_Obj* value = *it++;
64 if (Tcl_DictObjPut(interp, obj, key, value) != TCL_OK) {
65 throwException(interp);
72 auto* interp = interp_.interp;
74 if (Tcl_GetIntFromObj(interp, obj, &result) != TCL_OK) {
75 throwException(interp);
83 if (Tcl_GetIntFromObj(
nullptr, obj, &result) != TCL_OK) {
91 auto* interp = interp_.interp;
93 if (Tcl_GetBooleanFromObj(interp, obj, &result) != TCL_OK) {
94 throwException(interp);
102 if (Tcl_GetBooleanFromObj(
nullptr, obj, &result) != TCL_OK) {
113 return narrow_cast<float>(
getDouble(interp_));
118 return narrow_cast<float>(*d);
125 auto* interp = interp_.interp;
127 if (Tcl_GetDoubleFromObj(interp, obj, &result) != TCL_OK) {
128 throwException(interp);
136 if (Tcl_GetDoubleFromObj(
nullptr, obj, &result) != TCL_OK) {
145 char* buf = Tcl_GetStringFromObj(obj, &length);
146 return {buf, size_t(length)};
152 auto* buf = Tcl_GetByteArrayFromObj(obj, &length);
153 return {buf, size_t(length)};
158 auto* interp = interp_.interp;
160 if (Tcl_ListObjLength(interp, obj, &result) != TCL_OK) {
161 throwException(interp);
165unsigned TclObject::getListLengthUnchecked()
const
168 if (Tcl_ListObjLength(
nullptr, obj, &result) != TCL_OK) {
176 auto* interp = interp_.interp;
178 if (Tcl_ListObjIndex(interp, obj, narrow<int>(index), &element) != TCL_OK) {
179 throwException(interp);
186 if (Tcl_ListObjIndex(
nullptr, obj, narrow<int>(index), &element) != TCL_OK) {
195 auto* interp = interp_.interp;
196 if (Tcl_ListObjReplace(interp, obj, narrow<int>(index), 1, 0,
nullptr) != TCL_OK) {
197 throwException(interp);
204 auto* interp = interp_.interp;
205 if (Tcl_DictObjPut(interp, obj, key.obj, value.obj) != TCL_OK) {
206 throwException(interp);
212 auto* interp = interp_.interp;
214 if (Tcl_DictObjGet(interp, obj, key.obj, &value) != TCL_OK) {
215 throwException(interp);
223 if ((Tcl_DictObjGet(
nullptr, obj, key.obj, &value) != TCL_OK) || !value) {
231 auto* interp = interp_.interp;
233 if (Tcl_ExprBooleanObj(interp, obj, &result) != TCL_OK) {
234 throwException(interp);
241 auto* interp = interp_.interp;
243 if (Tcl_ExprObj(interp, obj, &result) != TCL_OK) {
244 throwException(interp);
251 auto* interp = interp_.interp;
252 int flags = compile ? 0 : TCL_EVAL_DIRECT;
253 int success = Tcl_EvalObjEx(interp, obj, flags);
254 if (success != TCL_OK) {
257 return TclObject(Tcl_GetObjResult(interp));
bool getBoolean(Interpreter &interp) const
TclObject executeCommand(Interpreter &interp, bool compile=false)
Interpret this TclObject as a command and execute it.
unsigned getListLength(Interpreter &interp) const
TclObject getListIndexUnchecked(unsigned index) const
TclObject getListIndex(Interpreter &interp, unsigned index) const
bool evalBool(Interpreter &interp) const
std::optional< TclObject > getOptionalDictValue(const TclObject &key) const
void removeListIndex(Interpreter &interp, unsigned index)
double getDouble(Interpreter &interp) const
float getFloat(Interpreter &interp) const
TclObject eval(Interpreter &interp) const
void addListElement(const T &t)
std::span< const uint8_t > getBinary() const
std::optional< float > getOptionalFloat() const
int getInt(Interpreter &interp) const
void addDictKeyValues(Args &&... args)
std::optional< bool > getOptionalBool() const
TclObject getDictValue(Interpreter &interp, const TclObject &key) const
std::optional< int > getOptionalInt() const
zstring_view getString() const
std::optional< double > getOptionalDouble() const
void setDictValue(Interpreter &interp, const TclObject &key, const TclObject &value)
Like std::string_view, but with the extra guarantee that it refers to a zero-terminated string.
This file implemented 3 utility functions: