docs: def update(self, source_file, configuration, declarations, included_files):
          """Replace a cache entry by a new value.
  
          :param source_file: a C++ source file name.
          :type source_file: str
          :param configuration: configuration  object.
          :type configuration: :class:`xml_generator_configuration_t`
          :param declarations: declarations contained in the `source_file`
          :type declarations: pickable object
          :param included_files: included files
          :type included_files: list of str
          """
  
          # Normlize all paths...
          source_file = os.path.normpath(source_file)
          included_files = [os.path.normpath(p) for p in included_files]
  
          # Create the list of dependent files. This is the included_files list
          # + the source file. Duplicate names are removed.
          dependent_files = {}
          for name in [source_file] + included_files:
              dependent_files[name] = 1
  
          key = self._create_cache_key(source_file)
          # Remove an existing entry (if there is one)
          # After calling this method, it is guaranteed that __index[key]
          # does not exist anymore.
          self._remove_entry(source_file, key)
  
          # Create a new entry...
  
          # Create the sigs of all dependent files...
          filesigs = []
          for filename in list(dependent_files.keys()):
              id_, sig = self.__filename_rep.acquire_filename(filename)
              filesigs.append((id_, sig))
  
          configsig = self._create_config_signature(configuration)
          entry = index_entry_t(filesigs, configsig)
          self.__index[key] = entry
          self.__modified_flag = True
  
          # Write the declarations into the cache file...
          cachefilename = self._create_cache_filename(source_file)
          self._write_file(cachefilename, declarations)