<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: structure code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 25 Jul 2008 00:59:22 GMT</pubDate>
    <description>DZone Snippets: structure code</description>
    <item>
      <title>Basic Trie data structure in Ruby</title>
      <link>http://snippets.dzone.com/posts/show/5616</link>
      <description>&lt;code&gt;&lt;br /&gt;# Inspired by http://www.rubyquiz.com/quiz103.html&lt;br /&gt;# cf. also http://en.wikipedia.org/wiki/Trie&lt;br /&gt;&lt;br /&gt;#!/usr/local/bin/ruby -w&lt;br /&gt;&lt;br /&gt;require 'pp'&lt;br /&gt;&lt;br /&gt;class Hash&lt;br /&gt;&lt;br /&gt;   def deep_merge!(second)&lt;br /&gt;      # cf. http://snippets.dzone.com/posts/show/4146&lt;br /&gt;      merger = proc { |key,v1,v2| Hash === v1 &amp;&amp; Hash === v2 ? v1.merge(v2, &amp;merger) : v2 }&lt;br /&gt;      self.merge!(second, &amp;merger)&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def nested_hash(array)&lt;br /&gt;      node = self&lt;br /&gt;      array.each do |i|&lt;br /&gt;         node[i]=Hash.new if node[i].nil?&lt;br /&gt;         node = node[i]&lt;br /&gt;      end &lt;br /&gt;      self&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def merge_nested_hash!(nested_hash)&lt;br /&gt;      deep_merge!(nested_hash)&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   # code basis taken from: "Find every path and it's value in a Hash" by Florian A&#223;mann,&lt;br /&gt;   # http://snippets.dzone.com/posts/show/3565&lt;br /&gt;&lt;br /&gt;   def each_trie_path&lt;br /&gt;      raise ArgumentError unless block_given?&lt;br /&gt;      self.class.each_trie_path(self) { |path, object| yield(path, object) }&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   protected&lt;br /&gt;   def self.each_trie_path(object, path = [], &amp;block)  &lt;br /&gt;&lt;br /&gt;      if object.is_a?(Hash)&lt;br /&gt;         object.each do |key, value|&lt;br /&gt;&lt;br /&gt;            if key == true &amp;&amp; value == {}&lt;br /&gt;               if path == [:root]  # special case for empty string: [[:root], {true=&gt;{}}]&lt;br /&gt;                  yield(path, {true=&gt;{}})&lt;br /&gt;                  next&lt;br /&gt;               end&lt;br /&gt;               yield(path, object)&lt;br /&gt;            end&lt;br /&gt;&lt;br /&gt;            self.each_trie_path(value, [path , key].flatten, &amp;block)&lt;br /&gt;         end&lt;br /&gt;      else &lt;br /&gt;         yield(path, object)&lt;br /&gt;      end&lt;br /&gt;   end &lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Trie&lt;br /&gt;&lt;br /&gt;   @hash = Hash.new.merge_nested_hash!(Hash.new)&lt;br /&gt;   #@hash = Hash.new.merge_nested_hash!({:root=&gt;{}})&lt;br /&gt;   #@hash = Hash.new.merge_nested_hash!(Hash.new.nested_hash([:root]))&lt;br /&gt;   class &lt;&lt; self; attr_accessor :hash; end    # Trie.hash&lt;br /&gt;&lt;br /&gt;   def initialize&lt;br /&gt;      Trie.hash.merge_nested_hash!({:root=&gt;{}})&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def add_int(int)   # for int &gt;= 0&lt;br /&gt;      ia = int.to_s.scan(/[[:digit:]]/).map { |i| i.to_i }  # integer array; ex: [4,6,2]&lt;br /&gt;      ia.unshift(:root).push(true)&lt;br /&gt;      Trie.hash.merge_nested_hash!(Hash.new.nested_hash(ia))&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def matchi(int)  # match integer&lt;br /&gt;      ia = int.to_s.scan(/[[:digit:]]/).map { |i| i.to_i }  &lt;br /&gt;      node = Trie.hash.fetch(:root,nil)&lt;br /&gt;      ia.each do |digit|&lt;br /&gt;         node = node[digit]&lt;br /&gt;         #node = node.fetch(digit,nil)&lt;br /&gt;         return false unless node&lt;br /&gt;      end&lt;br /&gt;      node.fetch(true,nil) ? true : false&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def mfpi(int)   # match first part of integer&lt;br /&gt;      ia = int.to_s.scan(/[[:digit:]]/).map { |i| i.to_i }&lt;br /&gt;      node = Trie.hash.fetch(:root,nil)&lt;br /&gt;      ia.each do |digit|&lt;br /&gt;         node = node[digit]&lt;br /&gt;         return false unless node&lt;br /&gt;      end&lt;br /&gt;      return true&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def add_word(word)&lt;br /&gt;      ca = word.split(//u)    # UTF-8 aware character array&lt;br /&gt;      ca.unshift(:root).push(true)&lt;br /&gt;      Trie.hash.merge_nested_hash!(Hash.new.nested_hash(ca))&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def match(word)   # match entire word&lt;br /&gt;      ca = word.split(//u)    &lt;br /&gt;      node = Trie.hash.fetch(:root,nil)&lt;br /&gt;      ca.each do |char|&lt;br /&gt;         node = node[char]&lt;br /&gt;         #node = node.fetch(char,nil)&lt;br /&gt;         return false unless node&lt;br /&gt;      end&lt;br /&gt;      node.fetch(true,nil) ? true : false&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def mfpw(word)   # match first part of word&lt;br /&gt;      ca = word.split(//u)    &lt;br /&gt;      node = Trie.hash.fetch(:root,nil)&lt;br /&gt;      ca.each do |char|&lt;br /&gt;         node = node[char]&lt;br /&gt;         return false unless node&lt;br /&gt;      end&lt;br /&gt;      return true&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;trie = Trie.new&lt;br /&gt;p Trie.hash&lt;br /&gt;&lt;br /&gt;trie.add_word("word")&lt;br /&gt;pp Trie.hash            &lt;br /&gt;p trie.match("word")      &lt;br /&gt;p trie.match("word2")   &lt;br /&gt;trie.add_word("word2")&lt;br /&gt;p trie.match("word2")   &lt;br /&gt;pp Trie.hash            # {:root=&gt;{"w"=&gt;{"o"=&gt;{"r"=&gt;{"d"=&gt;{true=&gt;{}, "2"=&gt;{true=&gt;{}}}}}}}}&lt;br /&gt;&lt;br /&gt;trie.add_word("")&lt;br /&gt;p trie.match("")&lt;br /&gt;pp Trie.hash&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;p trie.match("word")      &lt;br /&gt;p trie.mfpw("wor")     # match first part of word&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;trie.add_int(12345)&lt;br /&gt;p Trie.hash&lt;br /&gt;&lt;br /&gt;trie.add_int(12980345)&lt;br /&gt;pp Trie.hash&lt;br /&gt;&lt;br /&gt;trie.add_int(8512)&lt;br /&gt;pp Trie.hash&lt;br /&gt;p trie.matchi(8512)&lt;br /&gt;p trie.matchi(85)&lt;br /&gt;p trie.mfpi(85)     # match first part of integer&lt;br /&gt;p trie.matchi(51)&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;pp Trie.hash&lt;br /&gt;paths = []&lt;br /&gt;Trie.hash.each_trie_path { |path, value| paths.push([ path ]) }&lt;br /&gt;#Trie.hash.each_trie_path { |path, value| paths.push([ path, value ]) }&lt;br /&gt;#pp paths&lt;br /&gt;puts&lt;br /&gt;paths.each { |x| p x }&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;require 'pp'&lt;br /&gt;&lt;br /&gt;class Hash&lt;br /&gt;   def Hash.new_nested_hash&lt;br /&gt;     Hash.new{|h,k| h[k]=Hash.new(&amp;h.default_proc) }&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Trie&lt;br /&gt;&lt;br /&gt;   @hash = Hash.new_nested_hash&lt;br /&gt;   #@hash = Hash.new_nested_hash.update(true=&gt;{})  # add empty string by default&lt;br /&gt;   class &lt;&lt; self; attr_accessor :hash; end    # Trie.hash&lt;br /&gt;&lt;br /&gt;   def &lt;&lt;(word)&lt;br /&gt;      ca = word.split(//u)    # UTF-8 aware character array&lt;br /&gt;      wl = ca.size            # word length&lt;br /&gt;      str = ""&lt;br /&gt;      wl.times { |x| str &lt;&lt; "[ca.at(#{x})]" }&lt;br /&gt;      str = "Trie.hash" &lt;&lt; str &lt;&lt; "[true]"&lt;br /&gt;      #p str     # example: "Trie.hash[ca.at(0)][ca.at(1)][ca.at(2)][ca.at(3)][true]"&lt;br /&gt;      eval(str)&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def match(word)&lt;br /&gt;      ca = word.split(//u)    # UTF-8 aware character array&lt;br /&gt;      wl = ca.size            # word length&lt;br /&gt;      str = ""&lt;br /&gt;&lt;br /&gt;      wl.times { |x| str &lt;&lt; ".fetch(ca.at(#{x}),nil)" }&lt;br /&gt;      str = "Trie.hash" &lt;&lt; str &lt;&lt; ".fetch(true,nil)"&lt;br /&gt;      #p str   # example: "Trie.hash.fetch(ca.at(0),nil).fetch(ca.at(1),nil).fetch(ca.at(2),nil).fetch(true,nil)"&lt;br /&gt;      ret = eval(str) rescue nil&lt;br /&gt;&lt;br /&gt;=begin&lt;br /&gt;      # alternative&lt;br /&gt;      wl.times { |x| str &lt;&lt; ".fetch(ca.at(#{x}),{})" }&lt;br /&gt;      str = "Trie.hash" &lt;&lt; str &lt;&lt; ".fetch(true,nil)"&lt;br /&gt;      #p str   # example: "Trie.hash.fetch(ca.at(0),{}).fetch(ca.at(1),{}).fetch(ca.at(2),{}).fetch(true,nil)"&lt;br /&gt;      ret = eval(str)&lt;br /&gt;=end&lt;br /&gt;&lt;br /&gt;      ret == {} ? true : false   # {} is the default value created by Trie.hash or Hash.new_nested_hash respectively&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;trie = Trie.new&lt;br /&gt;trie &lt;&lt; "word"&lt;br /&gt;pp Trie.hash            &lt;br /&gt;p trie.match("word")      &lt;br /&gt;p trie.match("word2")   &lt;br /&gt;trie &lt;&lt; "word2"&lt;br /&gt;p trie.match("word2")   &lt;br /&gt;pp Trie.hash            # {"w"=&gt;{"o"=&gt;{"r"=&gt;{"d"=&gt;{true=&gt;{}, "2"=&gt;{true=&gt;{}}}}}}}&lt;br /&gt;&lt;br /&gt;trie &lt;&lt; ""&lt;br /&gt;p trie.match("")&lt;br /&gt;pp Trie.hash&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# alternative with default :root element&lt;br /&gt;&lt;br /&gt;require 'pp'&lt;br /&gt;&lt;br /&gt;class Hash&lt;br /&gt;   def Hash.new_nested_hash&lt;br /&gt;     Hash.new{|h,k| h[k]=Hash.new(&amp;h.default_proc) }&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Hash&lt;br /&gt;&lt;br /&gt;   # code basis taken from: "Find every path and it's value in a Hash" by Florian A&#223;mann,&lt;br /&gt;   # http://snippets.dzone.com/posts/show/3565&lt;br /&gt;&lt;br /&gt;   def each_trie_path&lt;br /&gt;      raise ArgumentError unless block_given?&lt;br /&gt;      self.class.each_trie_path(self) { |path, object| yield(path, object) }&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   protected&lt;br /&gt;   def self.each_trie_path(object, path = [], &amp;block)  &lt;br /&gt;&lt;br /&gt;      if object.is_a?(Hash)&lt;br /&gt;         object.each do |key, value|&lt;br /&gt;&lt;br /&gt;            if key == true &amp;&amp; value == {}&lt;br /&gt;               if path == [:root]  # special case for empty string: [[:root], {true=&gt;{}}]&lt;br /&gt;                  yield(path, {true=&gt;{}})&lt;br /&gt;                  next&lt;br /&gt;               end&lt;br /&gt;               yield(path, object)&lt;br /&gt;            end&lt;br /&gt;&lt;br /&gt;            self.each_trie_path(value, [path , key].flatten, &amp;block)&lt;br /&gt;         end&lt;br /&gt;      else &lt;br /&gt;         yield(path, object)&lt;br /&gt;      end&lt;br /&gt;   end &lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Trie&lt;br /&gt;&lt;br /&gt;   @hash = Hash.new_nested_hash&lt;br /&gt;   class &lt;&lt; self; attr_accessor :hash; end    # Trie.hash&lt;br /&gt;&lt;br /&gt;   def initialize&lt;br /&gt;      Trie.hash[:root]&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def add_int(int)   # for int &gt;= 0&lt;br /&gt;      ia = int.to_s.scan(/[[:digit:]]/).map { |i| i.to_i }  # integer array; ex: [4,6,2]&lt;br /&gt;      ia.unshift(:root)&lt;br /&gt;      str = ""&lt;br /&gt;      ia.size.times { |x| str &lt;&lt; "[ia.at(#{x})]" }&lt;br /&gt;      str = "Trie.hash" &lt;&lt; str &lt;&lt; "[true]"&lt;br /&gt;      eval(str)&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def matchi(int)  # match integer&lt;br /&gt;      ia = int.to_s.scan(/[[:digit:]]/).map { |i| i.to_i }  &lt;br /&gt;      node = Trie.hash.fetch(:root,nil)&lt;br /&gt;      ia.each do |digit|&lt;br /&gt;         node = node.fetch(digit,nil)&lt;br /&gt;         return false unless node&lt;br /&gt;      end&lt;br /&gt;      node.fetch(true,nil) ? true : false&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def mfpi(int)   # match first part of integer&lt;br /&gt;      ia = int.to_s.scan(/[[:digit:]]/).map { |i| i.to_i }&lt;br /&gt;      node = Trie.hash.fetch(:root,nil)&lt;br /&gt;      ia.each do |digit|&lt;br /&gt;         node = node.fetch(digit,nil)&lt;br /&gt;         return false unless node&lt;br /&gt;      end&lt;br /&gt;      return true&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def &lt;&lt;(word)&lt;br /&gt;      ca = word.split(//u)    # UTF-8 aware character array&lt;br /&gt;      ca.unshift(:root)&lt;br /&gt;      #ca = [:root, *word.split(//u)]&lt;br /&gt;      #ca = [:root].concat(word.split(//u))&lt;br /&gt;      str = ""&lt;br /&gt;      ca.size.times { |x| str &lt;&lt; "[ca.at(#{x})]" }&lt;br /&gt;      str = "Trie.hash" &lt;&lt; str &lt;&lt; "[true]"&lt;br /&gt;      #p str     # example: "Trie.hash[ca.at(0)][ca.at(1)][ca.at(2)][ca.at(3)][true]"&lt;br /&gt;      eval(str)&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def match(word)&lt;br /&gt;      ca = word.split(//u)    &lt;br /&gt;      ca.unshift(:root)&lt;br /&gt;      #ca = [:root, *word.split(//u)]&lt;br /&gt;      #ca = [:root].concat(word.split(//u))&lt;br /&gt;      str = ""&lt;br /&gt;      ca.size.times { |x| str &lt;&lt; ".fetch(ca.at(#{x}),nil)" }&lt;br /&gt;      str = "Trie.hash" &lt;&lt; str &lt;&lt; ".fetch(true,nil)"&lt;br /&gt;      #p str   # example: "Trie.hash.fetch(ca.at(0),nil).fetch(ca.at(1),nil).fetch(ca.at(2),nil).fetch(true,nil)"&lt;br /&gt;      ret = eval(str) rescue nil&lt;br /&gt;&lt;br /&gt;=begin&lt;br /&gt;      # alternative&lt;br /&gt;      ca.size.times { |x| str &lt;&lt; ".fetch(ca.at(#{x}),{})" }&lt;br /&gt;      str = "Trie.hash" &lt;&lt; str &lt;&lt; ".fetch(true,nil)"&lt;br /&gt;      #p str   # example: "Trie.hash.fetch(ca.at(0),{}).fetch(ca.at(1),{}).fetch(ca.at(2),{}).fetch(true,nil)"&lt;br /&gt;      ret = eval(str)&lt;br /&gt;=end&lt;br /&gt;&lt;br /&gt;      ret == {} ? true : false   # {} is the default value created by Trie.hash or Hash.new_nested_hash respectively&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def match2(word)   # match entire word&lt;br /&gt;      ca = word.split(//u)    &lt;br /&gt;      node = Trie.hash.fetch(:root,nil)&lt;br /&gt;      ca.each do |char|&lt;br /&gt;         node = node.fetch(char,nil)&lt;br /&gt;         return false unless node&lt;br /&gt;      end&lt;br /&gt;      node.fetch(true,nil) ? true : false&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   def mfpw(word)   # match first part of word&lt;br /&gt;      ca = word.split(//u)    &lt;br /&gt;      node = Trie.hash.fetch(:root,nil)&lt;br /&gt;      ca.each do |char|&lt;br /&gt;         node = node.fetch(char,nil)&lt;br /&gt;         return false unless node&lt;br /&gt;      end&lt;br /&gt;      return true&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;trie = Trie.new&lt;br /&gt;trie &lt;&lt; "word"&lt;br /&gt;pp Trie.hash            &lt;br /&gt;p trie.match("word")      &lt;br /&gt;p trie.match("word2")   &lt;br /&gt;trie &lt;&lt; "word2"&lt;br /&gt;p trie.match("word2")   &lt;br /&gt;pp Trie.hash            # {:root=&gt;{"w"=&gt;{"o"=&gt;{"r"=&gt;{"d"=&gt;{true=&gt;{}, "2"=&gt;{true=&gt;{}}}}}}}}&lt;br /&gt;&lt;br /&gt;trie &lt;&lt; ""&lt;br /&gt;p trie.match("")&lt;br /&gt;pp Trie.hash&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;p trie.match2("word")      &lt;br /&gt;p trie.mfpw("wor")     # match first part of word&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;trie.add_int(8512)&lt;br /&gt;pp Trie.hash&lt;br /&gt;p trie.matchi(8512)&lt;br /&gt;p trie.matchi(85)&lt;br /&gt;p trie.mfpi(85)     # match first part of integer&lt;br /&gt;p trie.matchi(51)&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;puts&lt;br /&gt;pp Trie.hash&lt;br /&gt;paths = []&lt;br /&gt;Trie.hash.each_trie_path { |path, value| paths.push([ path ]) }&lt;br /&gt;#Trie.hash.each_trie_path { |path, value| paths.push([ path, value ]) }&lt;br /&gt;#pp paths&lt;br /&gt;puts&lt;br /&gt;paths.each { |x| p x }&lt;br /&gt;puts&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 07 Jun 2008 20:54:39 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5616</guid>
      <author>ntk ()</author>
    </item>
    <item>
      <title>Automating Zend MVC Structure</title>
      <link>http://snippets.dzone.com/posts/show/5241</link>
      <description>Automating Zend MVC Structure&lt;br /&gt;This is what I use... It's very useful.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;#&lt;br /&gt;# Automate the creation of the Zend MVC Framework&lt;br /&gt;# Script Written by: Fernando Barajas&lt;br /&gt;# Usage: php ./zendcreate.php&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;# Create the Zend MVC Framework.&lt;br /&gt;define('ZEND_FILE_TYPE', '.tar.gz');&lt;br /&gt;define('ZEND_FILE_NAME', 'ZendFramework-1.5.0'. ZEND_FILE_TYPE);&lt;br /&gt;define('ZEND_FRAMEWORK_URL', 'http://framework.zend.com/releases/ZendFramework-1.5.0/'. ZEND_FILE_NAME);&lt;br /&gt;define('APPLICATION_NAME', 'zend_'. time());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;passthru("wget ". ZEND_FRAMEWORK_URL);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if(file_exists(ZEND_FILE_NAME)) {&lt;br /&gt;	# unzip the file -- tar zxvf ./ZEND_FILE_NAME&lt;br /&gt;	passthru("tar zxvf ". ZEND_FILE_NAME);&lt;br /&gt;	&lt;br /&gt;	# Make the Applications Directories&lt;br /&gt;	passthru("mkdir ". APPLICATION_NAME);&lt;br /&gt;	&lt;br /&gt;	# Move the Library directory into the application directory&lt;br /&gt;	passthru("mv ./". basename(ZEND_FILE_NAME, ZEND_FILE_TYPE) ."/library ./". APPLICATION_NAME ."/library");&lt;br /&gt;	&lt;br /&gt;	# Make the App Directory &lt;br /&gt;	passthru("mkdir ". APPLICATION_NAME ."/app");&lt;br /&gt;	&lt;br /&gt;		passthru("mkdir ". APPLICATION_NAME ."/app/controllers");&lt;br /&gt;		passthru("mkdir ". APPLICATION_NAME ."/app/models");&lt;br /&gt;		passthru("mkdir ". APPLICATION_NAME ."/app/views");&lt;br /&gt;			&lt;br /&gt;			passthru("mkdir ". APPLICATION_NAME ."/app/views/scripts");&lt;br /&gt;			&lt;br /&gt;	&lt;br /&gt;	# Make the public Directory&lt;br /&gt;	passthru("mkdir ". APPLICATION_NAME ."/public");&lt;br /&gt;	&lt;br /&gt;	# Make the Front Controller / Bootstrap file&lt;br /&gt;$zend_bootstrap_code = '&lt;br /&gt;&lt;?php&lt;br /&gt;# Set Error Reporting&lt;br /&gt;error_reporting(E_ALL|E_STRICT);&lt;br /&gt;ini_set(\'display_errors\', \'on\');&lt;br /&gt;&lt;br /&gt;# Set include path the DOCUMENT_ROOT / library for Zend Library&lt;br /&gt;ini_set(\'include_path\', $_SERVER[\'DOCUMENT_ROOT\']."/../library");&lt;br /&gt;&lt;br /&gt;# Zend Framework Includes&lt;br /&gt;require_once \'Zend/Loader.php\';&lt;br /&gt;&lt;br /&gt;Zend_Loader::loadClass(\'Zend_Controller_Front\');&lt;br /&gt;&lt;br /&gt;# Un-Comment the two lines below if you will be using Routes&lt;br /&gt;# Most likely you will be. I recommend that you do. &lt;br /&gt;# They are very useful&lt;br /&gt;#&lt;br /&gt;# Zend_Loader::loadClass(\'Zend_Controller_Router_Rewrite\');&lt;br /&gt;# Zend_Loader::loadClass(\'Zend_Controller_Router_Route_Regex\');&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;# Get the front controller instance&lt;br /&gt;$front = Zend_Controller_Front::getInstance();&lt;br /&gt;$front-&gt;setControllerDirectory("../app/controllers");&lt;br /&gt;&lt;br /&gt;$front-&gt;throwExceptions(true);&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# Get an Instance For Routing&lt;br /&gt;# $route = $front-&gt;getRouter(); // Returns a rewrite router by default&lt;br /&gt;# $route-&gt;addRoute(\'user\',&lt;br /&gt;#	new Zend_Controller_Router_Route(\'user/:username\', array(\'controller\' =&gt; \'index\', \'action\' =&gt; \'test\'))&lt;br /&gt;# );&lt;br /&gt;#&lt;br /&gt;# $route-&gt;addRoute(\'product\',&lt;br /&gt;#	new Zend_Controller_Router_Route_Regex(\'product/(\d+)\', array(\'controller\' =&gt; \'index\', \'action\' =&gt; \'test\'))&lt;br /&gt;# );&lt;br /&gt;#&lt;br /&gt;# $route-&gt;addRoute(\'login\',&lt;br /&gt;#	new Zend_Controller_Router_Route_Regex(\'login\', array(\'controller\' =&gt; \'index\', \'action\' =&gt; \'test\'))&lt;br /&gt;# );&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;# Start the dispatch&lt;br /&gt;$front-&gt;dispatch();&lt;br /&gt;&lt;br /&gt;?&gt;&lt;br /&gt;';&lt;br /&gt;	# Write the Bootstrap file&lt;br /&gt;	file_put_contents("./". APPLICATION_NAME ."/public/index.php", trim($zend_bootstrap_code));&lt;br /&gt;	&lt;br /&gt;# Write The Index Controller&lt;br /&gt;$zend_index_controller_code = '&lt;br /&gt;&lt;?php&lt;br /&gt;&lt;br /&gt;class IndexController extends Zend_Controller_Action {&lt;br /&gt;&lt;br /&gt;	public function indexAction() {&lt;br /&gt;		# =&gt; Logic code here...&lt;br /&gt;		$this-&gt;view-&gt;random_number = rand(0,10);&lt;br /&gt;		$this-&gt;view-&gt;status = "It works!";&lt;br /&gt;		$this-&gt;render("index");&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;?&gt;&lt;br /&gt;';&lt;br /&gt;	# Write the First Index Controller&lt;br /&gt;	file_put_contents("./". APPLICATION_NAME ."/app/controllers/IndexController.php", trim($zend_index_controller_code));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Write the index view file&lt;br /&gt;$zend_index_view_code = '&lt;br /&gt;&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;&lt;br /&gt;&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;&lt;br /&gt;&lt;head&gt;&lt;br /&gt;  &lt;meta http-equiv="content-type" content="text/html;charset=UTF-8" /&gt;&lt;br /&gt;  &lt;title&gt;Zend Framework&lt;/title&gt;&lt;br /&gt;&lt;/head&gt;&lt;br /&gt;&lt;body&gt;&lt;br /&gt;&lt;h2&gt;Status: &lt;?= $this-&gt;status ?&gt;&lt;/h2&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;	Random Number: &lt;?= $this-&gt;random_number ?&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/body&gt;&lt;br /&gt;&lt;/html&gt;&lt;br /&gt;';&lt;br /&gt;	# Write the First Index View File&lt;br /&gt;	passthru("mkdir ./". APPLICATION_NAME ."/app/views/scripts/index");&lt;br /&gt;	file_put_contents("./". APPLICATION_NAME ."/app/views/scripts/index/index.phtml", $zend_index_view_code);&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;# Create the .htaccess file&lt;br /&gt;$zend_htaccess_code = '&lt;br /&gt;RewriteEngine On&lt;br /&gt;RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php&lt;br /&gt;';&lt;br /&gt;	# Write the .htaccess code to disk&lt;br /&gt;	file_put_contents("./". APPLICATION_NAME ."/public/.htaccess", trim($zend_htaccess_code));&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;	# Delete the Downloaded Framework Directory and tar file&lt;br /&gt;	passthru("rm -f ./". ZEND_FILE_NAME);&lt;br /&gt;	passthru("rm -rf ./". basename(ZEND_FILE_NAME, ZEND_FILE_TYPE));&lt;br /&gt;	&lt;br /&gt;	passthru("clear");&lt;br /&gt;	&lt;br /&gt;	echo "\nZend Framework has been created... Done!\n\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 17 Mar 2008 15:13:29 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5241</guid>
      <author>fernyb (Fernando)</author>
    </item>
    <item>
      <title>reverse linked list</title>
      <link>http://snippets.dzone.com/posts/show/2678</link>
      <description>Reverse Linked list by reversing links for each node or swapping the nodes at each end.&lt;br /&gt;</description>
      <pubDate>Sat, 23 Sep 2006 17:46:59 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2678</guid>
      <author>nevadalife (nevada)</author>
    </item>
    <item>
      <title>a binary tree structure "PersistentTree"</title>
      <link>http://snippets.dzone.com/posts/show/436</link>
      <description>unit StreamAdapter.pas&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com&lt;br /&gt;&lt;br /&gt;unit StreamAdapter;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Classes;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  IStream = interface( IInterface )&lt;br /&gt;    ['{FBEF199A-09BC-4B61-89EA-1EF8B22C93A5}']&lt;br /&gt;    function Read(var Buffer; const Count: Longint): Longint;&lt;br /&gt;    function Write(const Buffer; const Count: Longint): Longint;&lt;br /&gt;    function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;&lt;br /&gt;    procedure ReadBuffer(var Buffer; const Count: Longint);&lt;br /&gt;    procedure WriteBuffer(const Buffer; const Count: Longint);&lt;br /&gt;    function CopyFrom(Source: TStream; const Count: Int64): Int64;&lt;br /&gt;    function WriteTo(Dest: TStream; const Count: Int64): Int64;&lt;br /&gt;&lt;br /&gt;    procedure SetPosition( const Value: Int64 );&lt;br /&gt;    procedure SetSize( const Value: Int64 );&lt;br /&gt;    function GetPosition: Int64;&lt;br /&gt;    function GetSize: Int64;&lt;br /&gt;&lt;br /&gt;    property Position: Int64 read GetPosition write SetPosition;&lt;br /&gt;    property Size: Int64 read GetSize write SetSize;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  TStreamAdapter = class( TInterfacedObject, IStream )&lt;br /&gt;  private&lt;br /&gt;    FStream: TStream;&lt;br /&gt;    procedure SetPosition( const Value: Int64 );&lt;br /&gt;    procedure SetSize( const Value: Int64 );&lt;br /&gt;    function GetPosition: Int64;&lt;br /&gt;    function GetSize: Int64;&lt;br /&gt;&lt;br /&gt;  public&lt;br /&gt;    constructor Create( Stream: TStream );&lt;br /&gt;    destructor Destroy; override;&lt;br /&gt;&lt;br /&gt;    function Read(var Buffer; const Count: Longint): Longint;&lt;br /&gt;    function Write(const Buffer; const Count: Longint): Longint;&lt;br /&gt;&lt;br /&gt;    procedure ReadBuffer(var Buffer; const Count: Longint);&lt;br /&gt;    procedure WriteBuffer(const Buffer; const Count: Longint);&lt;br /&gt;&lt;br /&gt;    function CopyFrom(Source: TStream; const Count: Int64): Int64;&lt;br /&gt;    function WriteTo(Dest: TStream; const Count: Int64): Int64;&lt;br /&gt;&lt;br /&gt;    function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;&lt;br /&gt;&lt;br /&gt;    property Position: Int64 read GetPosition write SetPosition;&lt;br /&gt;    property Size: Int64 read GetSize write SetSize;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{ TStreamAdapter }&lt;br /&gt;&lt;br /&gt;function TStreamAdapter.CopyFrom(Source: TStream; const Count: Int64): Int64;&lt;br /&gt;begin&lt;br /&gt;  Result := FStream.CopyFrom( Source, Count );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor TStreamAdapter.Create(Stream: TStream);&lt;br /&gt;begin&lt;br /&gt;  FStream := Stream;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TStreamAdapter.Destroy;&lt;br /&gt;begin&lt;br /&gt;  FStream.Free;&lt;br /&gt;  inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TStreamAdapter.GetPosition: Int64;&lt;br /&gt;begin&lt;br /&gt;  Result := FStream.Position;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TStreamAdapter.GetSize: Int64;&lt;br /&gt;begin&lt;br /&gt;  Result := FStream.Size;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TStreamAdapter.Read(var Buffer; const Count: Integer): Longint;&lt;br /&gt;begin&lt;br /&gt;  Result := FStream.Read( Buffer, Count );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TStreamAdapter.ReadBuffer(var Buffer; const Count: Integer);&lt;br /&gt;begin&lt;br /&gt;  FStream.ReadBuffer( Buffer, Count );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TStreamAdapter.Seek(const Offset: Int64;&lt;br /&gt;  Origin: TSeekOrigin): Int64;&lt;br /&gt;begin&lt;br /&gt;  Result := FStream.Seek( Offset, Origin );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TStreamAdapter.SetPosition(const Value: Int64);&lt;br /&gt;begin&lt;br /&gt;  FStream.Position := Value;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TStreamAdapter.SetSize(const Value: Int64);&lt;br /&gt;begin&lt;br /&gt;  FStream.Size := Value;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TStreamAdapter.Write(const Buffer; const Count: Integer): Longint;&lt;br /&gt;begin&lt;br /&gt;  Result := FStream.Write( Buffer, Count );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TStreamAdapter.WriteBuffer(const Buffer; const Count: Integer);&lt;br /&gt;begin&lt;br /&gt;  FStream.WriteBuffer( Buffer, Count );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TStreamAdapter.WriteTo(Dest: TStream; const Count: Int64): Int64;&lt;br /&gt;begin&lt;br /&gt;  Result := Dest.CopyFrom( FStream, Count );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;unit PersistentTree.pas&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com&lt;br /&gt;&lt;br /&gt;unit PersistentTree;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Windows, Classes, SysUtils, StreamAdapter;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  EPersistentTree = class( Exception );&lt;br /&gt;&lt;br /&gt;  TPersistentTree = class;&lt;br /&gt;&lt;br /&gt;  TPersistentTreeClass = class of TPersistentTree;&lt;br /&gt;&lt;br /&gt;  TPersistentTree = class( TStream )&lt;br /&gt;  private&lt;br /&gt;    FStream: IStream;&lt;br /&gt;    FList: TList;&lt;br /&gt;    FBaseClass: TPersistentTreeClass;&lt;br /&gt;    FOwner, FParent: TPersistentTree;&lt;br /&gt;    FOwnStream: Boolean;&lt;br /&gt;    FDataFilename, FFilename: string;&lt;br /&gt;    FLastPosition, FDataBegin, FDataLength: Int64;&lt;br /&gt;&lt;br /&gt;    function GetItem(const Index: Integer): TPersistentTree;&lt;br /&gt;    function GetCount: Integer;&lt;br /&gt;    function GetStream: TStream;&lt;br /&gt;    function Import( Item: TPersistentTree ): Boolean;&lt;br /&gt;    procedure ClearData;&lt;br /&gt;    procedure RecreateStream( const Pos: Int64; const Deep: Boolean = False );&lt;br /&gt;    procedure Synchronize;&lt;br /&gt;&lt;br /&gt;  protected&lt;br /&gt;    //override to provide writing/reading notifications&lt;br /&gt;    procedure Loaded; virtual;&lt;br /&gt;    procedure Saving; virtual;&lt;br /&gt;&lt;br /&gt;    //derived from TStream&lt;br /&gt;    function GetSize: Int64; override;&lt;br /&gt;    procedure SetSize(NewSize: Longint); override;&lt;br /&gt;    procedure SetSize(const NewSize: Int64); override;&lt;br /&gt;&lt;br /&gt;  public&lt;br /&gt;    constructor Create; virtual;&lt;br /&gt;    destructor Destroy; override;&lt;br /&gt;&lt;br /&gt;    //derived from TStream&lt;br /&gt;    function Read( var Buffer; Count: Longint ): Longint; override;&lt;br /&gt;    function Write( const Buffer; Count: Longint ): Longint; override;&lt;br /&gt;    function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;&lt;br /&gt;&lt;br /&gt;    function Truncate: Int64;&lt;br /&gt;    function ReadString: string;&lt;br /&gt;    procedure WriteString( const Data: string );&lt;br /&gt;&lt;br /&gt;    procedure Save( const AFilename: string ); overload;&lt;br /&gt;    procedure Save( Stream: TStream ); overload;&lt;br /&gt;    procedure Load( const AFilename: string ); overload;&lt;br /&gt;    procedure Load( Stream: IStream ); overload;&lt;br /&gt;    procedure Load( Stream: TStream ); overload;&lt;br /&gt;&lt;br /&gt;    function Add: TPersistentTree; overload;&lt;br /&gt;    function Add( Item: TPersistentTree ): Integer; overload;&lt;br /&gt;    procedure Insert( const Index: Integer; Item: TPersistentTree);&lt;br /&gt;    function IndexOf( Item: TPersistentTree ): Integer;&lt;br /&gt;    function Remove( Item: TPersistentTree ): Integer;&lt;br /&gt;    procedure Delete( const Index: Integer);&lt;br /&gt;    function Extract( Item: TPersistentTree ): TPersistentTree;&lt;br /&gt;    procedure Exchange( const IndexA, IndexB: Integer );&lt;br /&gt;    procedure Move(const CurIndex, NewIndex: Integer);&lt;br /&gt;    procedure Clear;&lt;br /&gt;&lt;br /&gt;    property Items[ const Index: Integer ]: TPersistentTree read GetItem; default;&lt;br /&gt;    property Count: Integer read GetCount;&lt;br /&gt;    property Owner: TPersistentTree read FOwner;&lt;br /&gt;    property Parent: TPersistentTree read FParent;&lt;br /&gt;    property Filename: string read FFilename;&lt;br /&gt;    property BaseClass: TPersistentTreeClass read FBaseClass write FBaseClass;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  TPersistentTreeHeader = packed record&lt;br /&gt;    Sig: array[0..4] of Char;&lt;br /&gt;    Ver: Word;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;  PERSISTENT_TREE_HEADER: TPersistentTreeHeader = ( Sig: 'PTREE'; Ver: 1 );&lt;br /&gt;&lt;br /&gt;function GetTempFile: string;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;function GetTempFile: string;&lt;br /&gt;var&lt;br /&gt;  Path: array[0..MAX_PATH-1] of Char;&lt;br /&gt;begin&lt;br /&gt;  GetTempPath( MAX_PATH, Path );&lt;br /&gt;  GetTempFileName( Path, 'BUF', 0, Path );&lt;br /&gt;  Result := Path;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TPersistentTree }&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.Clear;&lt;br /&gt;var&lt;br /&gt;  I: Integer;&lt;br /&gt;begin&lt;br /&gt;  for I := FList.Count - 1 downto 0 do&lt;br /&gt;  begin&lt;br /&gt;    TPersistentTree( FList[I] ).Free;&lt;br /&gt;    FList.Delete( I );&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor TPersistentTree.Create;&lt;br /&gt;begin&lt;br /&gt;  FBaseClass := TPersistentTreeClass( Self.ClassType );&lt;br /&gt;  FList := TList.Create;&lt;br /&gt;  FStream := TStreamAdapter.Create( GetStream );&lt;br /&gt;  FOwnStream := True;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TPersistentTree.Destroy;&lt;br /&gt;begin&lt;br /&gt;  ClearData;&lt;br /&gt;  FList.Free;&lt;br /&gt;  inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.Exchange(const IndexA, IndexB: Integer);&lt;br /&gt;begin&lt;br /&gt;  FList.Exchange( IndexA, IndexB );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TPersistentTree.GetCount: Integer;&lt;br /&gt;begin&lt;br /&gt;  Result := FList.Count;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TPersistentTree.GetItem(const Index: Integer): TPersistentTree;&lt;br /&gt;begin&lt;br /&gt;  Result := FList[ Index ];&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TPersistentTree.IndexOf(&lt;br /&gt;  Item: TPersistentTree): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result := FList.IndexOf( Item );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.Load(const AFilename: string);&lt;br /&gt;var&lt;br /&gt;  FS: TFileStream;&lt;br /&gt;  //Header: TPersistentTreeHeader;&lt;br /&gt;begin&lt;br /&gt;  FS := TFileStream.Create( AFilename, fmOpenRead or fmShareDenyWrite );&lt;br /&gt;  try&lt;br /&gt;    //FS.Read( Header, SizeOf( TPersistentTreeHeader ) );&lt;br /&gt;    //if not CompareMem( @Header, @PERSISTENT_TREE_HEADER, SizeOf( TPersistentTreeHeader ) ) then&lt;br /&gt;    //  raise EPersistentTree.CreateFmt( '%s.LoadFromFile :: "%s" Not Recognized', [ClassName, AFilename] );&lt;br /&gt;    Load( FS );&lt;br /&gt;    FFilename := AFilename;&lt;br /&gt;  except&lt;br /&gt;    FS.Free;&lt;br /&gt;    raise;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.Load(Stream: TStream);&lt;br /&gt;begin&lt;br /&gt;  Load( TStreamAdapter.Create( Stream ) );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TPersistentTree.Remove(Item: TPersistentTree): Integer;&lt;br /&gt;begin&lt;br /&gt;  Result := FList.Remove( Item );&lt;br /&gt;  if Result &gt;= 0 then&lt;br /&gt;    Item.Free;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.Save( const AFilename: string );&lt;br /&gt;var&lt;br /&gt;  FS: TFileStream;&lt;br /&gt;begin&lt;br /&gt;  FS := TFileStream.Create( AFilename, fmCreate or fmShareDenyWrite );&lt;br /&gt;  try&lt;br /&gt;    //FS.Write( PERSISTENT_TREE_HEADER, SizeOf( TPersistentTreeHeader ) );&lt;br /&gt;    Save( FS );&lt;br /&gt;  finally&lt;br /&gt;    FS.Free;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.Save(Stream: TStream);&lt;br /&gt;var&lt;br /&gt;  I: LongInt;&lt;br /&gt;begin&lt;br /&gt;  Seek( 0, soBeginning );&lt;br /&gt;  Saving;&lt;br /&gt;&lt;br /&gt;  FDataLength := Size;&lt;br /&gt;  Stream.Write( FDataLength, SizeOf( FDataLength ) );&lt;br /&gt;  Stream.CopyFrom( Self, 0 );&lt;br /&gt;&lt;br /&gt;  I := FList.Count;&lt;br /&gt;  Stream.Write( I, SizeOf( I ) );&lt;br /&gt;  for I := 0 to FList.Count-1 do&lt;br /&gt;    Self[I].Save( Stream );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TPersistentTree.Write( const Buffer; Count: Longint ): Longint;&lt;br /&gt;begin&lt;br /&gt;  if FOwnStream then&lt;br /&gt;    Result := FStream.Write( Buffer, Count )&lt;br /&gt;  else&lt;br /&gt;  begin&lt;br /&gt;    Synchronize;&lt;br /&gt;    if Position + Count &gt; Size then&lt;br /&gt;      RecreateStream( Position );&lt;br /&gt;    Result := FStream.Write( Buffer, Count );&lt;br /&gt;    FLastPosition := FStream.Position;          &lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TPersistentTree.Read( var Buffer; Count: Longint): Longint;&lt;br /&gt;begin&lt;br /&gt;  if FOwnStream then&lt;br /&gt;    Result := FStream.Read( Buffer, Count )&lt;br /&gt;  else&lt;br /&gt;  begin&lt;br /&gt;    Synchronize;&lt;br /&gt;    if Count &lt; 0 then&lt;br /&gt;      Count := 0&lt;br /&gt;    else if Count &gt; Size - Position then&lt;br /&gt;      Count := Size - Position;&lt;br /&gt;    Result := FStream.Read( Buffer, Count );&lt;br /&gt;    FLastPosition := FStream.Position;&lt;br /&gt;  end&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TPersistentTree.Seek(const Offset: Int64;&lt;br /&gt;  Origin: TSeekOrigin): Int64;&lt;br /&gt;begin&lt;br /&gt;  if FOwnStream then&lt;br /&gt;    Result := FStream.Seek( Offset, Origin )&lt;br /&gt;  else&lt;br /&gt;  begin&lt;br /&gt;    Synchronize;&lt;br /&gt;    case Origin of&lt;br /&gt;      soBeginning: Result := FDataBegin + Offset;&lt;br /&gt;      soCurrent: Result := FStream.Position + Offset;&lt;br /&gt;      soEnd: Result := FDataBegin + Size - Offset;&lt;br /&gt;    else&lt;br /&gt;      Result := 0;&lt;br /&gt;    end;&lt;br /&gt;    if Result &gt; -1 then&lt;br /&gt;      if Result &lt;= FDataBegin + Size then&lt;br /&gt;        Result := FStream.Seek( Result, soBeginning ) - FDataBegin&lt;br /&gt;      else&lt;br /&gt;      begin&lt;br /&gt;        RecreateStream( Size );&lt;br /&gt;        Result := FStream.Seek( Result, soBeginning );&lt;br /&gt;      end;&lt;br /&gt;    FLastPosition := FStream.Position;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.SetSize(const NewSize: Int64);&lt;br /&gt;begin&lt;br /&gt;  if FOwnStream then&lt;br /&gt;    FStream.Size := NewSize&lt;br /&gt;  else begin&lt;br /&gt;    if NewSize &lt;= 0 then&lt;br /&gt;      RecreateStream( 0 )&lt;br /&gt;    else if NewSize &gt; Size then&lt;br /&gt;      RecreateStream( Size )&lt;br /&gt;    else&lt;br /&gt;    begin&lt;br /&gt;      FDataLength := NewSize;&lt;br /&gt;      Seek( 0, soEnd );&lt;br /&gt;    end;&lt;br /&gt;    FLastPosition := FStream.Position;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.Synchronize;&lt;br /&gt;begin&lt;br /&gt;  if not FOwnStream and ( ( FStream.Position &lt; FDataBegin ) or ( FStream.Position - FDataBegin &gt; FDataLength ) ) then&lt;br /&gt;    FStream.Seek( FLastPosition, soBeginning );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.Load( Stream: IStream);&lt;br /&gt;var&lt;br /&gt;  I: LongInt;&lt;br /&gt;begin&lt;br /&gt;  ClearData;&lt;br /&gt;&lt;br /&gt;  FStream := Stream;&lt;br /&gt;  FOwnStream := False;&lt;br /&gt;&lt;br /&gt;  Stream.Read( FDataLength, SizeOf( FDataLength ) );&lt;br /&gt;  FDataBegin := FStream.Position;&lt;br /&gt;  FLastPosition := FDataBegin;&lt;br /&gt;&lt;br /&gt;  Stream.Seek( FDataLength, soCurrent );&lt;br /&gt;&lt;br /&gt;  Stream.Read( I, SizeOf( I ) );&lt;br /&gt;  for I := I - 1 downto 0 do&lt;br /&gt;    Add.Load( FStream );&lt;br /&gt;&lt;br /&gt;  //Seek( 0, soBeginning ); it isnt needed since synchonize will do it anyway&lt;br /&gt;  Loaded;&lt;br /&gt;  FStream.Seek( FDataBegin + FDataLength + SizeOf( I ), soBeginning );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TPersistentTree.Extract( Item: TPersistentTree): TPersistentTree;&lt;br /&gt;begin&lt;br /&gt;  Result := FList.Extract( Item );&lt;br /&gt;  if Assigned( Result ) then begin&lt;br /&gt;    Result.FParent := nil;&lt;br /&gt;    Result.FOwner := nil;&lt;br /&gt;    Result.RecreateStream( Size, True );&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function TPersistentTree.GetSize: Int64;&lt;br /&gt;begin&lt;br /&gt;  if FOwnStream then&lt;br /&gt;    Result := FStream.Size&lt;br /&gt;  else&lt;br /&gt;    Result := FDataLength;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.WriteString(const Data: string);&lt;br /&gt;var&lt;br /&gt;  I: LongWord;&lt;br /&gt;begin&lt;br /&gt;  I := Length( Data );&lt;br /&gt;  Write( I, SizeOf( I ) );&lt;br /&gt;  Write( Pointer( Data )^, I );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TPersistentTree.ReadString: string;&lt;br /&gt;var&lt;br /&gt;  I: LongWord;&lt;br /&gt;begin&lt;br /&gt;  Read( I, SizeOf( I ) );&lt;br /&gt;  SetLength( Result, I );&lt;br /&gt;  Read( Pointer( Result )^, I );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.SetSize(NewSize: Integer);&lt;br /&gt;begin&lt;br /&gt;  SetSize( Int64( NewSize ) );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.RecreateStream( const Pos: Int64; const Deep: Boolean );&lt;br /&gt;var&lt;br /&gt;  FS: TStream;&lt;br /&gt;  I: Integer;&lt;br /&gt;begin&lt;br /&gt;  if not FOwnStream then&lt;br /&gt;  begin&lt;br /&gt;    FS := GetStream;&lt;br /&gt;    if Pos &gt; 0 then&lt;br /&gt;    begin&lt;br /&gt;      Seek( 0, soBeginning );&lt;br /&gt;      FS.CopyFrom( Self, Pos );&lt;br /&gt;    end;&lt;br /&gt;    FStream := TStreamAdapter.Create( FS );&lt;br /&gt;    FOwnStream := True;&lt;br /&gt;  end;&lt;br /&gt;  if Deep then&lt;br /&gt;    for I := 0 to FList.Count - 1 do&lt;br /&gt;      Self[I].RecreateStream( Self[I].Size, True );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.ClearData;&lt;br /&gt;begin&lt;br /&gt;  FStream := nil;&lt;br /&gt;  if FOwnStream then&lt;br /&gt;    DeleteFile( FDataFilename );&lt;br /&gt;  Clear;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TPersistentTree.GetStream: TStream;&lt;br /&gt;begin&lt;br /&gt;  FDataFilename := GetTempFile;&lt;br /&gt;  Result := TFileStream.Create( FDataFilename, fmCreate or fmShareDenyWrite );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TPersistentTree.Add: TPersistentTree;&lt;br /&gt;begin&lt;br /&gt;  Result := TPersistentTreeClass( FBaseClass ).Create;&lt;br /&gt;  Add( Result );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TPersistentTree.Add( Item: TPersistentTree): Integer;&lt;br /&gt;begin&lt;br /&gt;  if Import( Item ) then&lt;br /&gt;    Result := FList.Add( Item )&lt;br /&gt;  else&lt;br /&gt;    Result := FList.IndexOf( Item );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.Delete(const Index: Integer);&lt;br /&gt;begin&lt;br /&gt;  TPersistentTree( FList[Index] ).Free;&lt;br /&gt;  FList.Delete( Index );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.Insert(const Index: Integer; Item: TPersistentTree);&lt;br /&gt;begin&lt;br /&gt;  if Import( Item ) then&lt;br /&gt;    FList.Insert( Index, Item )&lt;br /&gt;  else&lt;br /&gt;    FList.Move( FList.IndexOf( Item ), Index );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.Move(const CurIndex, NewIndex: Integer);&lt;br /&gt;begin&lt;br /&gt;  FList.Move( CurIndex, NewIndex );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TPersistentTree.Truncate: Int64;&lt;br /&gt;begin&lt;br /&gt;  Result := Position;&lt;br /&gt;  Size := Result;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TPersistentTree.Import(Item: TPersistentTree): Boolean;&lt;br /&gt;begin&lt;br /&gt;  Result := not Assigned( Item.FParent ) or ( ( Item.FParent &lt;&gt; Self ) and Assigned( Item.FParent.Extract( Item ) ) );&lt;br /&gt;  if Result then&lt;br /&gt;  begin&lt;br /&gt;    Item.FParent := Self;&lt;br /&gt;    if FOwner &lt;&gt; nil then&lt;br /&gt;      Item.FOwner := FOwner&lt;br /&gt;    else&lt;br /&gt;      Item.FOwner := Self;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.Saving;&lt;br /&gt;begin&lt;br /&gt;//override to provide extra save features&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TPersistentTree.Loaded;&lt;br /&gt;begin&lt;br /&gt;//override to provide extra load features&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 02 Jul 2005 03:50:02 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/436</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
  </channel>
</rss>
