Possible way to achieve lazy loading with const objects
Simen Kjaeraas
simen.kjaras at gmail.com
Sun Sep 25 17:02:06 PDT 2011
On Sat, 24 Sep 2011 13:19:33 +0200, Peter Alexander
<peter.alexander.au at gmail.com> wrote:
> Lazy loading and caching are the same thing.
>
> struct Foo
> {
> T m_lazyObj = null;
> bool m_isLoaded = false;
>
> T getObj()
> {
> if (!m_isLoaded)
> {
> m_lazyObj = func();
> m_isLoaded = true;
> }
> return m_lazyObj;
> }
> }
>
> Change m_lazyObj to m_cachedObj and m_isLoaded to m_isCached and you
> have caching.
This is too simple. If the system also rewrites all members to @properties
that
sets m_isLoaded = true, it might work. Example:
struct S {
int n;
lazy int otherN = () { return n + 2; } // compile time error here if
you refer to lazily initialized members.
}
=>
struct S {
int __n;
int __otherN;
bool __otherNloaded = false;
@property
int n( ) {
return __n;
}
@property
int n(int value) {
if (__n != value) {
__n = value;
__otherNloaded = false;
}
return __n;
}
@property
int otherN( ) {
if (!__otherNloaded) {
__otherN = () { return n + 2; }();
__otherNloaded = true;
}
return __otherN;
}
}
Now, the overhead might be troublesome, but this seems to me to work.
--
Simen
More information about the Digitalmars-d
mailing list