Skip to content

Commit

Permalink
Move QualType to its own file, change pointer access API.
Browse files Browse the repository at this point in the history
  • Loading branch information
dvander committed Jul 28, 2024
1 parent 5b693c4 commit fd82555
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 30 deletions.
61 changes: 61 additions & 0 deletions compiler/qualtype.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/* vim: set sts=4 ts=8 sw=4 tw=99 et: */
//
// Copyright (c) AlliedModders LLC, 2024
//
// This software is provided "as-is", without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from
// the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software in
// a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
#pragma once

#include <amtl/am-bits.h>
#include <amtl/am-hashtable.h>

namespace sp {
namespace cc {

class Type;

// Compact encoding of type + constness.
class QualType {
public:
explicit QualType(Type* type) {
impl_ = type;
}
explicit QualType(Type* type, bool is_const) {
impl_ = ke::SetPointerBits(type, is_const ? 1 : 0);
}

bool is_const() const {
return ke::GetPointerBits<2>(impl_) == 1;
}

Type* operator *() const { return ptr(); }
Type* operator ->() const { return ptr(); }
Type* ptr() const {
return ke::ClearPointerBits<2>(impl_);
}
QualType unqualified() const { return QualType(ptr()); }

uint32_t hash() const { return ke::HashPointer(impl_); }

bool operator ==(const QualType& other) const { return impl_ == other.impl_; }
bool operator !=(const QualType& other) const { return impl_ != other.impl_; }

private:
Type* impl_;
};

} // namespace cc
} // namespace sp
31 changes: 1 addition & 30 deletions compiler/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include "pool-objects.h"
#include "shared/string-atom.h"
#include "stl/stl-vector.h"
#include "qualtype.h"

typedef int32_t cell;
typedef uint32_t ucell;
Expand Down Expand Up @@ -85,36 +86,6 @@ class MethodmapDecl;
class PstructDecl;
class Type;

// Compact encoding of type + constness.
class QualType {
public:
explicit QualType(Type* type) {
impl_ = type;
}
explicit QualType(Type* type, bool is_const) {
impl_ = ke::SetPointerBits(type, is_const ? 1 : 0);
}

bool is_const() const {
return ke::GetPointerBits<2>(impl_) == 1;
}

Type* operator *() const { return unqualified(); }
Type* operator ->() const { return unqualified(); }
Type* unqualified() const {
return ke::ClearPointerBits<2>(impl_);
}

uint32_t hash() const { return ke::HashPointer(impl_); }

bool operator ==(const QualType& other) const { return impl_ == other.impl_; }
bool operator !=(const QualType& other) const { return impl_ != other.impl_; }

private:
Type* impl_;
};


struct TypenameInfo {
static constexpr uintptr_t kAtomFlag = 0x1;
static constexpr uintptr_t kLabelFlag = 0x2;
Expand Down

0 comments on commit fd82555

Please sign in to comment.