#pragma once
template <class Internal, class Opaque>
class CCIInternal {
public:
typedef CCIInternal <Internal, Opaque> CCIInternalType;
CCIInternal () {
mPublicData.functions = &Internal::sFunctionTable;
}
~CCIInternal () {}
static Internal* Internalize (
Opaque* inOpaque) {
Internal* internal =
static_cast <Internal*> (
reinterpret_cast <CCIInternalType*> (
reinterpret_cast <char*> (inOpaque) -
offsetof (CCIInternalType, mPublicData)));
internal -> Validate ();
return internal;
}
Opaque* Externalize () {
return &mPublicData;
}
bool Valid () {
return mPublicData.functions == &Internal::sFunctionTable;
}
protected:
Opaque& GetPublicData () { return mPublicData; }
private:
Opaque mPublicData;
};
#if CCache_v2_compat
#include <Kerberos/CredentialsCache2.h>
template <class Internal, class Opaque>
class CCIInternalWorkaround {
public:
typedef CCIInternalWorkaround <Internal, Opaque> CCIInternalType;
CCIInternalWorkaround () {
}
~CCIInternalWorkaround () {}
static Internal* Internalize (
Opaque* inOpaque) {
Internal* internal =
static_cast <Internal*> (
reinterpret_cast <CCIInternalType*> (
reinterpret_cast <char*> (inOpaque) -
offsetof (CCIInternalType, mPublicData)));
internal -> Validate ();
return internal;
}
Opaque* Externalize () {
return &mPublicData;
}
bool Valid () {
return true;
}
protected:
Opaque& GetPublicData () { return mPublicData; }
private:
Opaque mPublicData;
};
#endif