class_docstr: A delayed version of the "data" field in __cuda_array_interface__.
  
  The idea is to delay the access to `Buffer.ptr` until the user
  actually accesses the data pointer.
  
  For instance, in many cases __cuda_array_interface__ is accessed
  only to determine whether an object is a CUDA object or not.
  
  TODO: this doesn't support libraries such as PyTorch that declare
  the tuple of __cuda_array_interface__["data"] in Cython. In such
  cases, Cython will raise an error because DelayedPointerTuple
  isn't a "real" tuple.
class_docstr_tok: ["A","delayed","version","of","the","``","data","''","field","in","__cuda_array_interface__",".","The","idea","is","to","delay","the","access","to","`","Buffer.ptr","`","until","the","user","actually","accesses","the","data","pointer",".","For","instance",",","in","many","cases","__cuda_array_interface__","is","accessed","only","to","determine","whether","an","object","is","a","CUDA","object","or","not",".","TODO",":","this","does","n't","support","libraries","such","as","PyTorch","that","declare","the","tuple","of","__cuda_array_interface__","[","``","data","''","]","in","Cython",".","In","such","cases",",","Cython","will","raise","an","error","because","DelayedPointerTuple","is","n't","a","``","real","''","tuple","."]
code: def __len__(self):
      return 2
  
imports: from __future__ import annotations
  import collections.abc
  import pickle
  import time
  import weakref
  from threading import RLock
  from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional, Tuple
  import numpy
  from typing_extensions import Self
  import rmm
  from cudf.core.buffer.buffer import Buffer, BufferOwner, cuda_array_interface_wrapper, host_memory_allocation
  from cudf.utils.nvtx_annotation import _get_color_for_nvtx, annotate
  from cudf.utils.string import format_bytes
label_desc: Use image node_id 2 for calling the DelayedPointerTuple obj's underlying member method code with example usage: obj.__len__() and returns: int