return isIntegerConstantExpr(Val, Ctx, 0, true) && Val == 0;
}
+/// getComponentType - Determine whether the components of this access are
+/// "point" "color" or "texture" elements.
OCUVectorComponent::ComponentType OCUVectorComponent::getComponentType() const {
// derive the component type, no need to waste space.
const char *compStr = Accessor.getName();
assert(0 && "getComponentType(): Illegal accessor");
}
+/// containsDuplicateComponents - Return true if any element access is
+/// repeated.
bool OCUVectorComponent::containsDuplicateComponents() const {
const char *compStr = Accessor.getName();
unsigned length = strlen(compStr);
static bool classof(const MemberExpr *) { return true; }
};
-/// OCUVectorComponent
+/// OCUVectorComponent - This represents access to specific components of a
+/// vector, and may occur on the left hand side or right hand side. For example
+/// the following is legal: "V.xy = V.zw" if V is a 4 element ocu vector.
///
class OCUVectorComponent : public Expr {
Expr *Base;
SourceLocation AccessorLoc;
public:
enum ComponentType {
- Point,
- Color,
- Texture
+ Point, // xywz
+ Color, // rgba
+ Texture // uv
};
OCUVectorComponent(QualType ty, Expr *base, IdentifierInfo &accessor,
SourceLocation loc) : Expr(OCUVectorComponentClass, ty),
Base(base), Accessor(accessor), AccessorLoc(loc) {}
- Expr *getBase() const { return Base; }
- IdentifierInfo & getAccessor() const { return Accessor; }
+ const Expr *getBase() const { return Base; }
+ Expr *getBase() { return Base; }
+
+ IdentifierInfo &getAccessor() const { return Accessor; }
+
+ /// getComponentType - Determine whether the components of this access are
+ /// "point" "color" or "texture" elements.
ComponentType getComponentType() const;
+ /// containsDuplicateComponents - Return true if any element access is
+ /// repeated.
bool containsDuplicateComponents() const;
virtual SourceRange getSourceRange() const {