summaryrefslogtreecommitdiff
path: root/src/locators
diff options
context:
space:
mode:
authorBen Bridle <ben@derelict.engineering>2025-03-03 17:03:15 +1300
committerBen Bridle <ben@derelict.engineering>2025-03-03 17:03:15 +1300
commit9e238ddaaa503210b8e079429a978edeccdef99c (patch)
treeeea0778a68472110a47a720b3d84f3c3688bc516 /src/locators
parent4fc47fbdf92e5714e8b39f65b881e0b909894c67 (diff)
downloadassembler-9e238ddaaa503210b8e079429a978edeccdef99c.zip
Add Tracked type
The Tracked type allows tagging an arbitrary type with a SourceSpan.
Diffstat (limited to 'src/locators')
-rw-r--r--src/locators/mod.rs2
-rw-r--r--src/locators/tracked.rs58
2 files changed, 60 insertions, 0 deletions
diff --git a/src/locators/mod.rs b/src/locators/mod.rs
index b7db1ee..80dcb69 100644
--- a/src/locators/mod.rs
+++ b/src/locators/mod.rs
@@ -1,5 +1,7 @@
mod bytecode;
mod source;
+mod tracked;
pub use bytecode::*;
pub use source::*;
+pub use tracked::*;
diff --git a/src/locators/tracked.rs b/src/locators/tracked.rs
new file mode 100644
index 0000000..091ee52
--- /dev/null
+++ b/src/locators/tracked.rs
@@ -0,0 +1,58 @@
+use crate::*;
+
+#[derive(Clone)]
+pub struct Tracked<T> {
+ pub source: SourceSpan,
+ pub value: T,
+}
+
+impl<T> Tracked<T> {
+ pub fn from(value: T, source: SourceSpan) -> Self {
+ Self { source, value }
+ }
+}
+
+impl<T> std::ops::Deref for Tracked<T> {
+ type Target = T;
+ fn deref(&self) -> &T {
+ &self.value
+ }
+}
+
+impl<T> std::ops::DerefMut for Tracked<T> {
+ fn deref_mut(&mut self) -> &mut T {
+ &mut self.value
+ }
+}
+
+impl<T> AsRef<T> for Tracked<T> {
+ fn as_ref(&self) -> &T {
+ &self.value
+ }
+}
+
+impl<T> AsMut<T> for Tracked<T> {
+ fn as_mut(&mut self) -> &mut T {
+ &mut self.value
+ }
+}
+
+impl<T: std::fmt::Display> std::fmt::Display for Tracked<T> {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
+ write!(f, "{}", self.value)
+ }
+}
+
+impl<T: std::fmt::Debug> std::fmt::Debug for Tracked<T> {
+ fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
+ write!(f, "{:?}", self.value)
+ }
+}
+
+impl<T: PartialEq> PartialEq for Tracked<T> {
+ fn eq(&self, other: &Tracked<T>) -> bool {
+ self.value.eq(&other.value)
+ }
+}
+
+impl<T: Eq> Eq for Tracked<T> {}