#include "TableGen.hpp"
#include "Types.h"
using ctablegen::tableGenFromRecType;
TableGenRecordKeeperRef tableGenRecordGetRecords(TableGenRecordRef record_ref) {
return wrap(&unwrap(record_ref)->getRecords());
}
TableGenStringRef tableGenRecordGetName(TableGenRecordRef record_ref) {
auto name = unwrap(record_ref)->getName();
return TableGenStringRef{.data = name.data(), .len = name.size()};
}
TableGenRecordValRef tableGenRecordGetValue(TableGenRecordRef record_ref,
TableGenStringRef name) {
return wrap(unwrap(record_ref)->getValue(StringRef(name.data, name.len)));
}
TableGenRecTyKind tableGenRecordGetFieldType(TableGenRecordRef record_ref,
TableGenStringRef name) {
auto value = unwrap(record_ref)->getValue(StringRef(name.data, name.len));
if (!value)
return TableGenInvalidRecTyKind;
return tableGenFromRecType(value->getType());
}
TableGenRecordValRef tableGenRecordGetFirstValue(TableGenRecordRef record_ref) {
auto values = unwrap(record_ref)->getValues();
if (values.empty()) {
return nullptr;
}
return wrap(values.begin());
}
TableGenRecordValRef tableGenRecordValNext(TableGenRecordRef record,
TableGenRecordValRef current) {
auto next = std::next(ArrayRef<RecordVal>::iterator(unwrap(current)));
if (next == unwrap(record)->getValues().end()) {
return nullptr;
}
return wrap(next);
}
TableGenBool tableGenRecordIsAnonymous(TableGenRecordRef record_ref) {
return unwrap(record_ref)->isAnonymous();
}
TableGenBool tableGenRecordIsSubclassOf(TableGenRecordRef record_ref,
TableGenStringRef name) {
return unwrap(record_ref)->isSubClassOf(StringRef(name.data, name.len));
}
TableGenSourceLocationRef tableGenRecordGetLoc(TableGenRecordRef record_ref) {
return wrap(new ArrayRef(unwrap(record_ref)->getLoc()));
}
void tableGenRecordPrint(TableGenRecordRef record_ref,
TableGenStringCallback callback, void *userData) {
ctablegen::CallbackOstream stream(callback, userData);
stream << *unwrap(record_ref);
}
void tableGenRecordDump(TableGenRecordRef record_ref) {
unwrap(record_ref)->dump();
}