cpp

Coverage Report

Created: 2025-05-19 06:06

/home/uke/oil/asdl/cpp_runtime.h
Line
Count
Source (jump to first uncovered line)
1
// Experiment toward trying to generate less C++ code in *.asdl.cc
2
// Problems:
3
// - Id_t type -> dependency issue
4
5
#ifndef ASDL_CPP_RUNTIME_H
6
#define ASDL_CPP_RUNTIME_H
7
8
#include "_gen/asdl/hnode.asdl.h"
9
#include "mycpp/runtime.h"
10
11
using hnode_asdl::color_e;
12
using hnode_asdl::hnode;
13
using hnode_asdl::hnode_t;
14
15
//
16
// ToPretty() overload set.  asdl/gen_cpp.py targets this.
17
//
18
19
0
inline hnode_t* ToPretty(bool item) {
20
  // T and F are also in asdl/runtime.py
21
22
  // TODO: use constant, not StrFromC
23
0
  return Alloc<hnode::Leaf>(item ? StrFromC("T") : StrFromC("F"),
24
0
                            color_e::OtherConst);
25
0
}
26
27
// uint16_t, int, double are the same
28
0
inline hnode_t* ToPretty(uint16_t item) {
29
0
  return Alloc<hnode::Leaf>(str(item), color_e::OtherConst);
30
0
}
31
32
35
inline hnode_t* ToPretty(int item) {
33
35
  return Alloc<hnode::Leaf>(str(item), color_e::OtherConst);
34
35
}
35
36
0
inline hnode_t* ToPretty(double item) {
37
0
  return Alloc<hnode::Leaf>(str(item), color_e::OtherConst);
38
0
}
39
40
0
inline hnode_t* ToPretty(mops::BigInt item) {
41
0
  return Alloc<hnode::Leaf>(mops::ToStr(item), color_e::OtherConst);
42
0
}
43
44
32
inline hnode_t* ToPretty(BigStr* item) {
45
  // Note: if we had strict Optional[T], we might not need this
46
32
  if (item == nullptr) {
47
    // TODO: use constant, not StrFromC
48
    // asdl/gen_cpp.py also uses "_"
49
0
    return Alloc<hnode::Leaf>(StrFromC("_"), color_e::OtherConst);
50
32
  } else {
51
32
    return Alloc<hnode::Leaf>(item, color_e::StringConst);
52
32
  }
53
32
}
54
55
#if 0
56
// Problem: we can't distinguish between T* and void* ?
57
// We need to call obj->PrettyTree() sometimes
58
inline hnode_t* ToPretty(void* item) {
59
  return Alloc<hnode::External>(item);
60
}
61
62
// The T param here is the item type
63
template <typename T>
64
hnode_t* ListPretty(List<T>* li, Dict<int, bool>* seen) {
65
  seen = seen ? seen : Alloc<Dict<int, bool>>();
66
  int heap_id = ObjectId(li);
67
  if (dict_contains(seen, heap_id)) {
68
    return Alloc<hnode::AlreadySeen>(heap_id);
69
  }
70
71
  hnode::Array* a = Alloc<hnode::Array>(Alloc<List<hnode_t*>>());
72
  for (ListIter<T> it(li); !it.Done(); it.Next()) {
73
    T item = it.Value();
74
    hnode_t* h = ToPretty(item);
75
    a->children->append(h);
76
  }
77
  return a;
78
}
79
#endif
80
81
#endif  // ASDL_CPP_RUNTIME_H