/**************************************************************************** ** ** This file is part of GAP, a system for computational discrete algebra. ** ** Copyright of GAP belongs to its developers, whose names are too numerous ** to list here. Please refer to the COPYRIGHT file for details. ** ** SPDX-License-Identifier: GPL-2.0-or-later
*/
/* * Functionality to traverse nested object structures.
*/ #include"traverse.h"
switch (method) { case TRAVERSE_BY_FUNCTION:
TraversalCopyFunc[type](traversal, copy, original); break; case TRAVERSE_NONE: break; case TRAVERSE_ALL: case TRAVERSE_ALL_BUT_FIRST:
size = size / sizeof(Obj); if (size && method == TRAVERSE_ALL_BUT_FIRST) {
ptr++;
size--;
} while (size) {
*ptr = ReplaceByCopy(traversal, *ptr);
ptr++;
size -= 1;
} break;
} return copy;
}
int PreMakeImmutableCheck(Obj obj)
{ if (!IS_BAG_REF(obj)) return 1; if (!IS_MUTABLE_OBJ(obj)) return 1; if (!CheckExclusiveWriteAccess(obj)) return 0; if (TraversalMethod[TNUM_OBJ(obj)] == TRAVERSE_NONE) return 1;
UInt len = LEN_PLIST(traversal.list); if (len == 0) { if (delimited) { // FIXME: honor asList return GetRegionOf(obj)->obj;
}
ErrorQuit("Object not in a readable region", 0, 0);
}
UInt i; for (i = 1; i <= len; i++) {
UInt loc = FindTraversedObj(&traversal, traversed[i]); if (loc) {
Obj original = traversed[i];
Obj copy;
copy = NewBag(TNUM_BAG(original), SIZE_BAG(original));
SET_ELM_PLIST(traversal.copyMap, loc, copy);
copies[i] = copy;
}
} for (i = 1; i <= len; i++) if (copies[i])
CopyBag(&traversal, copies[i], traversed[i]); if (imm) { for (i = 1; i <= len; i++) { if (copies[i])
MakeImmutable(copies[i]);
}
} if (asList) return copyList; else return copies[1];
}
Obj CopyTraversed(Obj traversedList)
{
TraversalState traversal;
UInt len, i; const Obj * traversed = CONST_ADDR_OBJ(traversedList);
BeginTraversal(&traversal);
len = LEN_PLIST(traversedList); if (len == 1) {
Obj obj = traversed[1]; if (!IS_BAG_REF(obj) || REGION(obj) == NULL) return obj;
} for (i = 1; i <= len; i++)
SeenDuringTraversal(&traversal, traversed[i]);
Obj copyList = NewList(len);
Obj * copies = ADDR_OBJ(copyList);
traversal.copyMap = NewList(LEN_PLIST(traversal.hashTable)); for (i = 1; i <= len; i++) {
Obj original = traversed[i];
UInt loc = FindTraversedObj(&traversal, original);
Obj copy;
copy = NewBag(TNUM_BAG(original), SIZE_BAG(original));
SET_ELM_PLIST(traversal.copyMap, loc, copy);
copies[i] = copy;
} for (i = 1; i <= len; i++)
CopyBag(&traversal, copies[i], traversed[i]); return copies[1];
}
/**************************************************************************** ** *F InitKernel( <module> ) . . . . . . . . initialise kernel data structures
*/ staticInt InitKernel ( StructInitInfo * module )
{ int i; for (i = FIRST_REAL_TNUM; i <= LAST_REAL_TNUM; i++) {
assert(TraversalMethod[i] == 0);
TraversalMethod[i] = TRAVERSE_NONE;
}
return 0;
}
/**************************************************************************** ** *F InitInfoGVars() . . . . . . . . . . . . . . . . . table of init functions
*/ static StructInitInfo module = { // init struct using C99 designated initializers; for a full list of // fields, please refer to the definition of StructInitInfo
.type = MODULE_BUILTIN,
.name = "traverse",
.initKernel = InitKernel,
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.