refactor(3p/nix/libexpr): Use Abseil collection types for parser state

Replaces the previous uses of the (ordered!) std::map and std::set
with absl::flat_hash_{map|set}.

After some careful reading it seems that there is actually no
ordering dependency on these types, and the (drop-in) replacements
perform slightly better.

Overall this is not fixing a bottleneck, just a driveby thing.

Change-Id: Ided695dc75676bd58515aa9382df0be0a09c565e
Reviewed-on: https://cl.tvl.fyi/c/depot/+/1220
Reviewed-by: glittershark <grfn@gws.fyi>
Reviewed-by: isomer <isomer@tvl.fyi>
Tested-by: BuildkiteCI
This commit is contained in:
Vincent Ambo 2020-07-16 22:00:26 +01:00 committed by tazjin
parent 1b42504a12
commit d470ec0d29
2 changed files with 13 additions and 2 deletions

View file

@ -3,6 +3,7 @@
#include <map>
#include <optional>
#include <variant>
#include <absl/container/flat_hash_map.h>
#include "libexpr/symbol-table.hh"
#include "libexpr/value.hh"
@ -183,6 +184,7 @@ struct ExprOpHasAttr : Expr {
struct ExprAttrs : Expr {
bool recursive;
struct AttrDef {
bool inherited;
Expr* e;
@ -192,16 +194,20 @@ struct ExprAttrs : Expr {
: inherited(inherited), e(e), pos(pos){};
AttrDef(){};
};
typedef std::map<Symbol, AttrDef> AttrDefs;
typedef absl::flat_hash_map<Symbol, AttrDef> AttrDefs;
AttrDefs attrs;
struct DynamicAttrDef {
Expr *nameExpr, *valueExpr;
Pos pos;
DynamicAttrDef(Expr* nameExpr, Expr* valueExpr, const Pos& pos)
: nameExpr(nameExpr), valueExpr(valueExpr), pos(pos){};
};
typedef std::vector<DynamicAttrDef> DynamicAttrDefs;
DynamicAttrDefs dynamicAttrs;
ExprAttrs() : recursive(false){};
COMMON_METHODS
};
@ -336,7 +342,7 @@ struct ExprPos : Expr {
struct StaticEnv {
bool isWith;
const StaticEnv* up;
typedef std::map<Symbol, unsigned int> Vars;
typedef absl::flat_hash_map<Symbol, unsigned int> Vars;
Vars vars;
StaticEnv(bool isWith, const StaticEnv* up) : isWith(isWith), up(up){};
};

View file

@ -26,6 +26,11 @@ class Symbol {
bool empty() const { return s->empty(); }
friend std::ostream& operator<<(std::ostream& str, const Symbol& sym);
template <typename H>
friend H AbslHashValue(H h, const Symbol& c) {
return H::combine(std::move(h), c.s);
}
};
// SymbolTable is a hash-set based symbol-interning mechanism.