home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _f3971d0fec61f8f09697afe333f1d81d < prev    next >
Text File  |  2000-03-23  |  26KB  |  661 lines

  1.  
  2. <HTML>
  3. <HEAD>
  4. <TITLE>Set::IntSpan - Manages sets of integers</TITLE>
  5. <LINK REL="stylesheet" HREF="../../../Active.css" TYPE="text/css">
  6. <LINK REV="made" HREF="mailto:">
  7. </HEAD>
  8.  
  9. <BODY>
  10. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  11. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  12. <STRONG><P CLASS=block> Set::IntSpan - Manages sets of integers</P></STRONG>
  13. </TD></TR>
  14. </TABLE>
  15.  
  16. <A NAME="__index__"></A>
  17. <!-- INDEX BEGIN -->
  18.  
  19. <UL>
  20.  
  21.     <LI><A HREF="#name">NAME</A></LI><LI><A HREF="#supportedplatforms">SUPPORTED PLATFORMS</A></LI>
  22.  
  23.     <LI><A HREF="#synopsis">SYNOPSIS</A></LI>
  24.     <LI><A HREF="#requires">REQUIRES</A></LI>
  25.     <LI><A HREF="#exports">EXPORTS</A></LI>
  26.     <UL>
  27.  
  28.         <LI><A HREF="#@export"><CODE>@EXPORT</CODE></A></LI>
  29.         <LI><A HREF="#@export_ok"><CODE>@EXPORT_OK</CODE></A></LI>
  30.     </UL>
  31.  
  32.     <LI><A HREF="#description">DESCRIPTION</A></LI>
  33.     <LI><A HREF="#set specifications">SET SPECIFICATIONS</A></LI>
  34.     <UL>
  35.  
  36.         <LI><A HREF="#empty">Empty</A></LI>
  37.         <LI><A HREF="#object reference">Object reference</A></LI>
  38.         <LI><A HREF="#array reference">Array reference</A></LI>
  39.         <LI><A HREF="#run list">Run list</A></LI>
  40.         <LI><A HREF="#finite forms">Finite forms</A></LI>
  41.         <LI><A HREF="#infinite forms">Infinite forms</A></LI>
  42.         <LI><A HREF="#empty forms">Empty forms</A></LI>
  43.         <LI><A HREF="#restrictions">Restrictions</A></LI>
  44.         <LI><A HREF="#examples">Examples</A></LI>
  45.     </UL>
  46.  
  47.     <LI><A HREF="#iterators">ITERATORS</A></LI>
  48.     <LI><A HREF="#methods">METHODS</A></LI>
  49.     <UL>
  50.  
  51.         <LI><A HREF="#creation">Creation</A></LI>
  52.         <LI><A HREF="#set operations">Set operations</A></LI>
  53.         <LI><A HREF="#comparison">Comparison</A></LI>
  54.         <LI><A HREF="#cardinality">Cardinality</A></LI>
  55.         <LI><A HREF="#membership">Membership</A></LI>
  56.         <LI><A HREF="#extrema">Extrema</A></LI>
  57.         <LI><A HREF="#iterators">Iterators</A></LI>
  58.     </UL>
  59.  
  60.     <LI><A HREF="#functions">FUNCTIONS</A></LI>
  61.     <LI><A HREF="#class variables">CLASS VARIABLES</A></LI>
  62.     <LI><A HREF="#diagnostics">DIAGNOSTICS</A></LI>
  63.     <LI><A HREF="#notes">NOTES</A></LI>
  64.     <UL>
  65.  
  66.         <LI><A HREF="#traps">Traps</A></LI>
  67.         <LI><A HREF="#cardinality">Cardinality</A></LI>
  68.         <LI><A HREF="#grep_set and map_set">grep_set and map_set</A></LI>
  69.         <LI><A HREF="#error handling">Error handling</A></LI>
  70.         <LI><A HREF="#limitations">Limitations</A></LI>
  71.         <LI><A HREF="#roots">Roots</A></LI>
  72.     </UL>
  73.  
  74.     <LI><A HREF="#author">AUTHOR</A></LI>
  75.     <LI><A HREF="#copyright">COPYRIGHT</A></LI>
  76. </UL>
  77. <!-- INDEX END -->
  78.  
  79. <HR>
  80. <P>
  81. <H1><A NAME="name">NAME</A></H1>
  82. <P>Set::IntSpan - Manages sets of integers</P>
  83. <P>
  84. <HR>
  85. <H1><A NAME="supportedplatforms">SUPPORTED PLATFORMS</A></H1>
  86. <UL>
  87. <LI>Linux</LI>
  88. <LI>Solaris</LI>
  89. <LI>Windows</LI>
  90. </UL>
  91. <HR>
  92. <H1><A NAME="synopsis">SYNOPSIS</A></H1>
  93. <PRE>
  94.   use Set::IntSpan qw(grep_set map_set);
  95. </PRE>
  96. <PRE>
  97.  
  98.   $Set::IntSpan::Empty_String = $string;</PRE>
  99. <PRE>
  100.  
  101.   $set    = new   Set::IntSpan $set_spec;
  102.   $valid  = valid Set::IntSpan $run_list;
  103.   $set    = copy  $set $set_spec;</PRE>
  104. <PRE>
  105.  
  106.   $run_list = run_list $set;
  107.   @elements = elements $set;</PRE>
  108. <PRE>
  109.  
  110.   $u_set = union      $set $set_spec;
  111.   $i_set = intersect  $set $set_spec;
  112.   $x_set = xor        $set $set_spec;
  113.   $d_set = diff       $set $set_spec;
  114.   $c_set = complement $set;</PRE>
  115. <PRE>
  116.  
  117.   equal      $set $set_spec;
  118.   equivalent $set $set_spec;
  119.   superset   $set $set_spec;
  120.   subset     $set $set_spec;</PRE>
  121. <PRE>
  122.  
  123.   $n = cardinality $set;</PRE>
  124. <PRE>
  125.  
  126.   empty      $set;
  127.   finite     $set;
  128.   neg_inf    $set;
  129.   pos_inf    $set;
  130.   infinite   $set;
  131.   universal  $set;</PRE>
  132. <PRE>
  133.  
  134.   member     $set $n;
  135.   insert     $set $n;
  136.   remove     $set $n;</PRE>
  137. <PRE>
  138.  
  139.   $min = min $set;
  140.   $max = max $set;</PRE>
  141. <PRE>
  142.  
  143.   $subset = grep_set { ... } $set;
  144.   $mapset = map_set  { ... } $set;</PRE>
  145. <PRE>
  146.  
  147.   for ($element=$set->first; defined $element; $element=$set->next) { ... }
  148.   for ($element=$set->last ; defined $element; $element=$set->prev) { ... }</PRE>
  149. <PRE>
  150.  
  151.   $element = $set->start($n);
  152.   $element = $set->current;</PRE>
  153. <P>
  154. <HR>
  155. <H1><A NAME="requires">REQUIRES</A></H1>
  156. <P>Perl 5.004, Exporter</P>
  157. <P>
  158. <HR>
  159. <H1><A NAME="exports">EXPORTS</A></H1>
  160. <P>
  161. <H2><A NAME="@export"><CODE>@EXPORT</CODE></A></H2>
  162. <P>Nothing</P>
  163. <P>
  164. <H2><A NAME="@export_ok"><CODE>@EXPORT_OK</CODE></A></H2>
  165. <P><CODE>grep_set</CODE>, <CODE>map_set</CODE></P>
  166. <P>
  167. <HR>
  168. <H1><A NAME="description">DESCRIPTION</A></H1>
  169. <P><CODE>Set::IntSpan</CODE> manages sets of integers.
  170. It is optimized for sets that have long runs of consecutive integers.
  171. These arise, for example, in .newsrc files, which maintain lists of articles:</P>
  172. <PRE>
  173.   alt.foo: 1-21,28,31
  174.   alt.bar: 1-14192,14194,14196-14221</PRE>
  175. <P>Sets are stored internally in a run-length coded form.
  176. This provides for both compact storage and efficient computation.
  177. In particular, 
  178. set operations can be performed directly on the encoded representation.</P>
  179. <P><CODE>Set::IntSpan</CODE> is designed to manage finite sets.
  180. However, it can also represent some simple infinite sets, such as 
  181. {x | x>n}.
  182. This allows operations involving complements to be carried out consistently, 
  183. without having to worry about the actual value of INT_MAX on your machine.</P>
  184. <P>
  185. <HR>
  186. <H1><A NAME="set specifications">SET SPECIFICATIONS</A></H1>
  187. <P>Many of the methods take a <EM>set specification</EM>.  
  188. There are four kinds of set specifications.</P>
  189. <P>
  190. <H2><A NAME="empty">Empty</A></H2>
  191. <P>If a set specification is omitted, then the empty set is assumed.
  192. Thus,</P>
  193. <PRE>
  194.   $set = new Set::IntSpan;</PRE>
  195. <P>creates a new, empty set.  Similarly,</P>
  196. <PRE>
  197.   copy $set;</PRE>
  198. <P>removes all elements from $set.</P>
  199. <P>
  200. <H2><A NAME="object reference">Object reference</A></H2>
  201. <P>If an object reference is given, it is taken to be a <CODE>Set::IntSpan</CODE> object.</P>
  202. <P>
  203. <H2><A NAME="array reference">Array reference</A></H2>
  204. <P>If an array reference is given, 
  205. then the elements of the array are taken to be the elements of the set.  
  206. The array may contain duplicate elements.
  207. The elements of the array may be in any order.</P>
  208. <P>
  209. <H2><A NAME="run list">Run list</A></H2>
  210. <P>If a string is given, it is taken to be a <EM>run list</EM>.
  211. A run list specifies a set using a syntax similar to that in newsrc files.</P>
  212. <P>A run list is a comma-separated list of <EM>runs</EM>.
  213. Each run specifies a set of consecutive integers.
  214. The set is the union of all the runs.</P>
  215. <P>Runs may be written in any of several forms.</P>
  216. <P>
  217. <H2><A NAME="finite forms">Finite forms</A></H2>
  218. <DL>
  219. <DT><STRONG><A NAME="item_n">n</A></STRONG><BR>
  220. <DD>
  221. { n }
  222. <P></P>
  223. <DT><STRONG><A NAME="item_a%2Db">a-b</A></STRONG><BR>
  224. <DD>
  225. {x | a<=x && x<=b}
  226. <P></P></DL>
  227. <P>
  228. <H2><A NAME="infinite forms">Infinite forms</A></H2>
  229. <DL>
  230. <DT><STRONG><A NAME="item_%28%2Dn">(-n</A></STRONG><BR>
  231. <DD>
  232. {x | x<=n}
  233. <P></P>
  234. <DT><STRONG><A NAME="item_n%2D%29">n-)</A></STRONG><BR>
  235. <DD>
  236. {x | x>=n}
  237. <P></P>
  238. <DT><STRONG><A NAME="item_%28%2D%29">(-)</A></STRONG><BR>
  239. <DD>
  240. The set of all integers
  241. <P></P></DL>
  242. <P>
  243. <H2><A NAME="empty forms">Empty forms</A></H2>
  244. <P>The empty set is consistently written as '' (the null string).
  245. It is also denoted by the special form '-' (a single dash).</P>
  246. <P>
  247. <H2><A NAME="restrictions">Restrictions</A></H2>
  248. <P>The runs in a run list must be disjoint, 
  249. and must be listed in increasing order.</P>
  250. <P>Valid characters in a run list are 0-9, '(', ')', '-' and ','.
  251. White space and underscore (_) are ignored.
  252. Other characters are not allowed.</P>
  253. <P>
  254. <H2><A NAME="examples">Examples</A></H2>
  255. <DL>
  256. <DT><STRONG><A NAME="item__%2D"> -</A></STRONG><BR>
  257. <DD>
  258. { }
  259. <P></P>
  260. <DT><STRONG><A NAME="item__1"> 1</A></STRONG><BR>
  261. <DD>
  262. { 1 }
  263. <P></P>
  264. <DT><STRONG><A NAME="item__1%2D2"> 1-2</A></STRONG><BR>
  265. <DD>
  266. { 1, 2 }
  267. <P></P>
  268. <DT><STRONG><A NAME="item__%2D5%2D%2D1"> -5--1</A></STRONG><BR>
  269. <DD>
  270. { -5, -4, -3, -2, -1 }
  271. <P></P>
  272. <DT><STRONG><A NAME="item__%28%2D%29"> (-)</A></STRONG><BR>
  273. <DD>
  274. the integers
  275. <P></P>
  276. <DT><STRONG><A NAME="item__%28%2D%2D1"> (--1</A></STRONG><BR>
  277. <DD>
  278. the negative integers
  279. <P></P>
  280. <DT><STRONG><A NAME="item__1%2D3%2C_4%2C_18%2D21"> 1-3, 4, 18-21</A></STRONG><BR>
  281. <DD>
  282. { 1, 2, 3, 4, 18, 19, 20, 21 }
  283. <P></P></DL>
  284. <P>
  285. <HR>
  286. <H1><A NAME="iterators">ITERATORS</A></H1>
  287. <P>Each set has a single <EM>iterator</EM>, 
  288. which is shared by all calls to 
  289. <A HREF="#item_first"><CODE>first</CODE></A>, <A HREF="#item_last"><CODE>last</CODE></A>, <A HREF="#item_start"><CODE>start</CODE></A>, <A HREF="#item_next"><CODE>next</CODE></A>, <A HREF="#item_prev"><CODE>prev</CODE></A>, and <A HREF="#item_current"><CODE>current</CODE></A>.
  290. At all times,
  291. the iterator is either an element of the set,
  292. or <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A>.</P>
  293. <P><A HREF="#item_first"><CODE>first</CODE></A>, <A HREF="#item_last"><CODE>last</CODE></A>, and <A HREF="#item_start"><CODE>start</CODE></A> set the iterator;
  294. <A HREF="#item_next"><CODE>next</CODE></A>, and <A HREF="#item_prev"><CODE>prev</CODE></A> move it;
  295. and <A HREF="#item_current"><CODE>current</CODE></A> returns it.
  296. Calls to these methods may be freely intermixed.</P>
  297. <P>Using <A HREF="#item_next"><CODE>next</CODE></A> and <A HREF="#item_prev"><CODE>prev</CODE></A>, 
  298. a single loop can move both forwards and backwards through a set.
  299. Using <A HREF="#item_start"><CODE>start</CODE></A>, a loop can iterate over portions of an infinite set.</P>
  300. <P>
  301. <HR>
  302. <H1><A NAME="methods">METHODS</A></H1>
  303. <P>
  304. <H2><A NAME="creation">Creation</A></H2>
  305. <DL>
  306. <DT><STRONG><A NAME="item_%24set_%3D_new_Set%3A%3AIntSpan_%24set_spec"><EM>$set</EM> = <CODE>new</CODE> <CODE>Set::IntSpan</CODE> <EM>$set_spec</EM></A></STRONG><BR>
  307. <DD>
  308. Creates and returns a <CODE>Set::IntSpan</CODE> object.
  309. The initial contents of the set are given by <EM>$set_spec</EM>.
  310. <P></P>
  311. <DT><STRONG><A NAME="item_%24ok_%3D_valid_Set%3A%3AIntSpan_%24run_list"><EM>$ok</EM> = <CODE>valid</CODE> <CODE>Set::IntSpan</CODE> <EM>$run_list</EM></A></STRONG><BR>
  312. <DD>
  313. Returns true if <EM>$run_list</EM> is a valid run list.
  314. Otherwise, returns false and leaves an error message in $@.
  315. <P></P>
  316. <DT><STRONG><A NAME="item_%24set_%3D_copy_%24set_%24set_spec"><EM>$set</EM> = <CODE>copy</CODE> <EM>$set</EM> <EM>$set_spec</EM></A></STRONG><BR>
  317. <DD>
  318. Copies <EM>$set_spec</EM> into <EM>$set</EM>.
  319. The previous contents of <EM>$set</EM> are lost.
  320. For convenience, <CODE>copy</CODE> returns <EM>$set</EM>.
  321. <P></P>
  322. <DT><STRONG><A NAME="item_%24run_list_%3D_run_list_%24set"><EM>$run_list</EM> = <CODE>run_list</CODE> <EM>$set</EM></A></STRONG><BR>
  323. <DD>
  324. Returns a run list that represents <EM>$set</EM>.
  325. The run list will not contain white space.
  326. <EM>$set</EM> is not affected.
  327. <P>By default, the empty set is formatted as '-'; 
  328. a different string may be specified in <A HREF="#item_%24Set%3A%3AIntSpan%3A%3AEmpty_String"><CODE>$Set::IntSpan::Empty_String</CODE></A>.</P>
  329. <P></P>
  330. <DT><STRONG><A NAME="item_%40elements_%3D_elements_%24set"><EM>@elements</EM> = <CODE>elements</CODE> <EM>$set</EM></A></STRONG><BR>
  331. <DD>
  332. Returns an array containing the elements of <EM>$set</EM>.
  333. The elements will be sorted in numerical order.
  334. In scalar context, returns an array reference.
  335. <EM>$set</EM> is not affected.
  336. <P></P></DL>
  337. <P>
  338. <H2><A NAME="set operations">Set operations</A></H2>
  339. <DL>
  340. <DT><STRONG><A NAME="item_%24u_set_%3D_union_%24set_%24set_spec"><EM>$u_set</EM> = <CODE>union</CODE> <EM>$set</EM> <EM>$set_spec</EM></A></STRONG><BR>
  341. <DD>
  342. Returns the set of integers in either <EM>$set</EM> or <EM>$set_spec</EM>.
  343. <P></P>
  344. <DT><STRONG><A NAME="item_%24i_set_%3D_intersect_%24set_%24set_spec"><EM>$i_set</EM> = <CODE>intersect</CODE> <EM>$set</EM> <EM>$set_spec</EM></A></STRONG><BR>
  345. <DD>
  346. Returns the set of integers in both <EM>$set</EM> and <EM>$set_spec</EM>.
  347. <P></P>
  348. <DT><STRONG><A NAME="item_%24x_set_%3D_xor_%24set_%24set_spec"><EM>$x_set</EM> = <CODE>xor</CODE> <EM>$set</EM> <EM>$set_spec</EM></A></STRONG><BR>
  349. <DD>
  350. Returns the set of integers in <EM>$set</EM> or <EM>$set_spec</EM>, 
  351. but not both.
  352. <P></P>
  353. <DT><STRONG><A NAME="item_%24d_set_%3D_diff_%24set_%24set_spec"><EM>$d_set</EM> = <CODE>diff</CODE> <EM>$set</EM> <EM>$set_spec</EM></A></STRONG><BR>
  354. <DD>
  355. Returns the set of integers in <EM>$set</EM> but not in <EM>$set_spec</EM>.
  356. <P></P>
  357. <DT><STRONG><A NAME="item_%24c_set_%3D_complement_%24set"><EM>$c_set</EM> = <CODE>complement</CODE> <EM>$set</EM></A></STRONG><BR>
  358. <DD>
  359. Returns the set of integers that are not in <EM>$set</EM>.
  360. <P></P></DL>
  361. <P>For all set operations, 
  362. a new <CODE>Set::IntSpan</CODE> object is created and returned.  
  363. The operands are not affected.</P>
  364. <P>
  365. <H2><A NAME="comparison">Comparison</A></H2>
  366. <DL>
  367. <DT><STRONG><A NAME="item_equal_%24set_%24set_spec"><CODE>equal</CODE> <EM>$set</EM> <EM>$set_spec</EM></A></STRONG><BR>
  368. <DD>
  369. Returns true iff <EM>$set</EM> and <EM>$set_spec</EM> contain the same elements.
  370. <P></P>
  371. <DT><STRONG><A NAME="item_equivalent_%24set_%24set_spec"><CODE>equivalent</CODE> <EM>$set</EM> <EM>$set_spec</EM></A></STRONG><BR>
  372. <DD>
  373. Returns true iff <EM>$set</EM> and <EM>$set_spec</EM> contain the same number of elements.
  374. All infinite sets are equivalent.
  375. <P></P>
  376. <DT><STRONG><A NAME="item_superset_%24set_%24set_spec"><CODE>superset</CODE> <EM>$set</EM> <EM>$set_spec</EM></A></STRONG><BR>
  377. <DD>
  378. Returns true iff <EM>$set</EM> is a superset of <EM>$set_spec</EM>.
  379. <P></P>
  380. <DT><STRONG><A NAME="item_subset_%24set_%24set_spec"><CODE>subset</CODE> <EM>$set</EM> <EM>$set_spec</EM></A></STRONG><BR>
  381. <DD>
  382. Returns true iff <EM>$set</EM> is a subset of <EM>$set_spec</EM>.
  383. <P></P></DL>
  384. <P>
  385. <H2><A NAME="cardinality">Cardinality</A></H2>
  386. <DL>
  387. <DT><STRONG><A NAME="item_%24n_%3D_cardinality_%24set"><EM>$n</EM> = <CODE>cardinality</CODE> <EM>$set</EM></A></STRONG><BR>
  388. <DD>
  389. Returns the number of elements in <EM>$set</EM>.
  390. Returns -1 for infinite sets.
  391. <P></P>
  392. <DT><STRONG><A NAME="item_empty_%24set"><CODE>empty</CODE> <EM>$set</EM></A></STRONG><BR>
  393. <DD>
  394. Returns true iff <EM>$set</EM> is empty.
  395. <P></P>
  396. <DT><STRONG><A NAME="item_finite_%24set"><CODE>finite</CODE> <EM>$set</EM></A></STRONG><BR>
  397. <DD>
  398. Returns true iff <EM>$set</EM> is finite.
  399. <P></P>
  400. <DT><STRONG><A NAME="item_neg_inf_%24set"><CODE>neg_inf</CODE> <EM>$set</EM></A></STRONG><BR>
  401. <DD>
  402. Returns true iff <EM>$set</EM> contains {x | x<n} for some n.
  403. <P></P>
  404. <DT><STRONG><A NAME="item_pos_inf_%24set"><CODE>pos_inf</CODE> <EM>$set</EM></A></STRONG><BR>
  405. <DD>
  406. Returns true iff <EM>$set</EM> contains {x | x>n} for some n.
  407. <P></P>
  408. <DT><STRONG><A NAME="item_infinite_%24set"><CODE>infinite</CODE> <EM>$set</EM></A></STRONG><BR>
  409. <DD>
  410. Returns true iff <EM>$set</EM> is infinite.
  411. <P></P>
  412. <DT><STRONG><A NAME="item_universal_%24set">universal <EM>$set</EM></A></STRONG><BR>
  413. <DD>
  414. Returns true iff <EM>$set</EM> contains all integers.
  415. <P></P></DL>
  416. <P>
  417. <H2><A NAME="membership">Membership</A></H2>
  418. <DL>
  419. <DT><STRONG><A NAME="item_member_%24set_%24n"><CODE>member</CODE> <EM>$set</EM> <EM>$n</EM></A></STRONG><BR>
  420. <DD>
  421. Returns true iff the integer <EM>$n</EM> is a member of <EM>$set</EM>.
  422. <P></P>
  423. <DT><STRONG><A NAME="item_insert_%24set_%24n"><CODE>insert</CODE> <EM>$set</EM> <EM>$n</EM></A></STRONG><BR>
  424. <DD>
  425. Inserts the integer <EM>$n</EM> into <EM>$set</EM>.
  426. Does nothing if <EM>$n</EM> is already a member of <EM>$set</EM>.
  427. <P></P>
  428. <DT><STRONG><A NAME="item_remove_%24set_%24n"><CODE>remove</CODE> <EM>$set</EM> <EM>$n</EM></A></STRONG><BR>
  429. <DD>
  430. Removes the integer <EM>$n</EM> from <EM>$set</EM>.
  431. Does nothing if <EM>$n</EM> is not a member of <EM>$set</EM>.
  432. <P></P></DL>
  433. <P>
  434. <H2><A NAME="extrema">Extrema</A></H2>
  435. <DL>
  436. <DT><STRONG><A NAME="item_min_%24set"><CODE>min</CODE> <EM>$set</EM></A></STRONG><BR>
  437. <DD>
  438. Returns the smallest element of <EM>$set</EM>, 
  439. or <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> if there is none.
  440. <P></P>
  441. <DT><STRONG><A NAME="item_max_%24set"><CODE>max</CODE> <EM>$set</EM></A></STRONG><BR>
  442. <DD>
  443. Returns the largest element of <EM>$set</EM>,
  444. or <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> if there is none.
  445. <P></P></DL>
  446. <P>
  447. <H2><A NAME="iterators">Iterators</A></H2>
  448. <DL>
  449. <DT><STRONG><A NAME="item_first"><EM>$set</EM>-><CODE>first</CODE></A></STRONG><BR>
  450. <DD>
  451. Sets the iterator for <EM>$set</EM> to the smallest element of <EM>$set</EM>.
  452. If there is no smallest element,
  453. sets the iterator to <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A>.
  454. Returns the iterator.
  455. <P></P>
  456. <DT><STRONG><A NAME="item_last"><EM>$set</EM>-><CODE>last</CODE></A></STRONG><BR>
  457. <DD>
  458. Sets the iterator for <EM>$set</EM> to the largest element of <EM>$set</EM>.
  459. If there is no largest element,
  460. sets the iterator to <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A>.
  461. Returns the iterator.
  462. <P></P>
  463. <DT><STRONG><A NAME="item_start"><EM>$set</EM>-><CODE>start</CODE>(<EM>$n</EM>)</A></STRONG><BR>
  464. <DD>
  465. Sets the iterator for <EM>$set</EM> to <EM>$n</EM>.
  466. If <EM>$n</EM> is not an element of <EM>$set</EM>,
  467. sets the iterator to <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A>.
  468. Returns the iterator.
  469. <P></P>
  470. <DT><STRONG><A NAME="item_next"><EM>$set</EM>-><CODE>next</CODE></A></STRONG><BR>
  471. <DD>
  472. Sets the iterator for <EM>$set</EM> to the next element of <EM>$set</EM>.
  473. If there is no next element,
  474. sets the iterator to <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A>.
  475. Returns the iterator.
  476. <P><A HREF="#item_next"><CODE>next</CODE></A> will return <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> only once;
  477. the next call to <A HREF="#item_next"><CODE>next</CODE></A> will reset the iterator to 
  478. the smallest element of <EM>$set</EM>.</P>
  479. <P></P>
  480. <DT><STRONG><A NAME="item_prev"><EM>$set</EM>-><CODE>prev</CODE></A></STRONG><BR>
  481. <DD>
  482. Sets the iterator for <EM>$set</EM> to the previous element of <EM>$set</EM>.
  483. If there is no previous element,
  484. sets the iterator to <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A>.
  485. Returns the iterator.
  486. <P><A HREF="#item_prev"><CODE>prev</CODE></A> will return <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> only once;
  487. the next call to <A HREF="#item_prev"><CODE>prev</CODE></A> will reset the iterator to 
  488. the largest element of <EM>$set</EM>.</P>
  489. <P></P>
  490. <DT><STRONG><A NAME="item_current"><EM>$set</EM>-><CODE>current</CODE></A></STRONG><BR>
  491. <DD>
  492. Returns the iterator for <EM>$set</EM>.
  493. <P></P></DL>
  494. <P>
  495. <HR>
  496. <H1><A NAME="functions">FUNCTIONS</A></H1>
  497. <DL>
  498. <DT><STRONG><A NAME="item_%24sub_set_%3D_grep_set_%7B_%2E%2E%2E_%7D_%24set"><EM>$sub_set</EM> = <CODE>grep_set</CODE> { ... } <EM>$set</EM></A></STRONG><BR>
  499. <DD>
  500. Evaluates the BLOCK for each integer in <EM>$set</EM> 
  501. (locally setting <CODE>$_</CODE> to each integer)
  502. and returns a <CODE>Set::IntSpan</CODE> object containing those integers
  503. for which the BLOCK returns TRUE.
  504. <P>Returns <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> if <EM>$set</EM> is infinite.</P>
  505. <P></P>
  506. <DT><STRONG><A NAME="item_%24map_set_%3D_map_set_%7B_%2E%2E%2E_%7D_%24set"><EM>$map_set</EM> = <CODE>map_set</CODE> { ... } <EM>$set</EM></A></STRONG><BR>
  507. <DD>
  508. Evaluates the BLOCK for each integer in <EM>$set</EM> 
  509. (locally setting <CODE>$_</CODE> to each integer) 
  510. and returns a <CODE>Set::IntSpan</CODE> object containg
  511. all the integers returned as results of all those evaluations.
  512. <P>Evaluates the BLOCK in list context, 
  513. so each element of <EM>$set</EM> may produce zero, one,
  514. or more elements in the returned set.</P>
  515. <P>Returns <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> if <EM>$set</EM> is infinite.</P>
  516. <P></P></DL>
  517. <P>
  518. <HR>
  519. <H1><A NAME="class variables">CLASS VARIABLES</A></H1>
  520. <DL>
  521. <DT><STRONG><A NAME="item_%24Set%3A%3AIntSpan%3A%3AEmpty_String"><CODE>$Set::IntSpan::Empty_String</CODE></A></STRONG><BR>
  522. <DD>
  523. <A HREF="#item_%24Set%3A%3AIntSpan%3A%3AEmpty_String"><CODE>$Set::IntSpan::Empty_String</CODE></A> contains the string that is returned when
  524. <CODE>run_list</CODE> is called on the empty set.
  525. <CODE>$Empty_String</CODE> is initially '-'; 
  526. alternatively, it may be set to ''.
  527. Other values should be avoided,
  528. to ensure that <CODE>run_list</CODE> always returns a valid run list.
  529. <P><CODE>run_list</CODE> accesses <CODE>$Empty_String</CODE> through a reference
  530. stored in <EM>$set</EM>->{<CODE>empty_string</CODE>}.
  531. Subclasses that wish to override the value of <CODE>$Empty_String</CODE> can
  532. reassign this reference.</P>
  533. <P></P></DL>
  534. <P>
  535. <HR>
  536. <H1><A NAME="diagnostics">DIAGNOSTICS</A></H1>
  537. <P>Any method (except <CODE>valid</CODE>) will <A HREF="../../../lib/Pod/perlfunc.html#item_die"><CODE>die</CODE></A> if it is passed an invalid run list.</P>
  538. <DL>
  539. <DT><STRONG><A NAME="item_Set%3A%3AIntSpan%3A%3A_copy_run_list%3A_Bad_syntax"><CODE>Set::IntSpan::_copy_run_list: Bad syntax:</CODE> <EM>$runList</EM></A></STRONG><BR>
  540. <DD>
  541. (F) <EM>$run_list</EM> has bad syntax
  542. <P></P>
  543. <DT><STRONG><A NAME="item_Set%3A%3AIntSpan%3A%3A_copy_run_list%3A_Bad_order%"><CODE>Set::IntSpan::_copy_run_list: Bad order:</CODE> <EM>$runList</EM></A></STRONG><BR>
  544. <DD>
  545. (F) <EM>$run_list</EM> has overlapping runs or runs that are out of order.
  546. <P></P>
  547. <DT><STRONG><A NAME="item_Set%3A%3AIntSpan%3A%3Aelements%3A_infinite_set"><CODE>Set::IntSpan::elements: infinite set</CODE></A></STRONG><BR>
  548. <DD>
  549. (F) An infinte set was passed to <CODE>elements</CODE>.
  550. <P></P>
  551. <DT><STRONG><A NAME="item_Out_of_memory%21">Out of memory!</A></STRONG><BR>
  552. <DD>
  553. (X) <CODE>elements</CODE> <EM>$set</EM> can generate an ``Out of memory!'' 
  554. message on sufficiently large finite sets.
  555. <P></P></DL>
  556. <P>
  557. <HR>
  558. <H1><A NAME="notes">NOTES</A></H1>
  559. <P>
  560. <H2><A NAME="traps">Traps</A></H2>
  561. <P>Beware of forms like</P>
  562. <PRE>
  563.   union $set [1..5];</PRE>
  564. <P>This passes an element of @set to union, 
  565. which is probably not what you want.
  566. To force interpretation of $set and [1..5] as separate arguments, 
  567. use forms like</P>
  568. <PRE>
  569.     union $set +[1..5];</PRE>
  570. <P>or</P>
  571. <PRE>
  572.     $set->union([1..5]);</PRE>
  573. <P>
  574. <H2><A NAME="cardinality">Cardinality</A></H2>
  575. <P>You cannot use the obvious comparison routine</P>
  576. <PRE>
  577.   { $a->cardinality <=> $b->cardinality }</PRE>
  578. <P>to sort sets by size, 
  579. because <CODE>cardinality</CODE> returns -1 for infinte sets.
  580. (All the non-negative integers were taken. Sorry.)</P>
  581. <P>Instead, you have to write something like</P>
  582. <PRE>
  583.   {  my $a_card = $a->cardinality;
  584.      my $b_card = $b->cardinality;
  585. </PRE>
  586. <PRE>
  587.  
  588.      $a_card == $b_card and return  0;
  589.      $a_card <  0       and return  1;
  590.      $b_card <  0       and return -1;
  591.      $a_card <=> $b_card                }</PRE>
  592. <P>
  593. <H2><A NAME="grep_set and map_set">grep_set and map_set</A></H2>
  594. <P><CODE>grep_set</CODE> and <CODE>map_set</CODE> make it easy to construct
  595. sets for which the internal representation used by <CODE>Set::IntSpan</CODE>
  596. is <EM>not</EM> small. Consider:</P>
  597. <PRE>
  598.   $billion = new Set::IntSpan '0-1_000_000_000';   # OK
  599.   $odd     = grep_set { $_ & 1 } $billion;         # trouble
  600.   $even    = map_set  { $_ * 2 } $billion;         # double trouble</PRE>
  601. <P>
  602. <H2><A NAME="error handling">Error handling</A></H2>
  603. <P>There are two common approaches to error handling:
  604. exceptions and return codes.
  605. There seems to be some religion on the topic,
  606. so <CODE>Set::IntSpan</CODE> provides support for both.</P>
  607. <P>To catch exceptions, protect method calls with an eval:</P>
  608. <PRE>
  609.     $run_list = <STDIN>;
  610.     eval { $set = new Set::IntSpan $run_list };
  611.     $@ and print "$@: try again\n";</PRE>
  612. <P>To check return codes, use an appropriate method call to validate arguments:</P>
  613. <PRE>
  614.     $run_list = <STDIN>;
  615.     if (valid Set::IntSpan $run_list) 
  616.        { $set = new Set::IntSpan $run_list }
  617.     else
  618.        { print "$@ try again\n" }</PRE>
  619. <P>Similarly, use <CODE>finite</CODE> to protect calls to <CODE>elements</CODE>:</P>
  620. <PRE>
  621.     finite $set and @elements = elements $set;</PRE>
  622. <P>Calling <CODE>elements</CODE> on a large, finite set can generate an ``Out of
  623. memory!'' message, which cannot (easily) be trapped.
  624. Applications that must retain control after an error can use <CODE>intersect</CODE> to 
  625. protect calls to <CODE>elements</CODE>:</P>
  626. <PRE>
  627.     @elements = elements { intersect $set "-1_000_000 - 1_000_000" };</PRE>
  628. <P>or check the size of $set first:</P>
  629. <PRE>
  630.     finite $set and cardinality $set < 2_000_000 and @elements = elements $set;</PRE>
  631. <P>
  632. <H2><A NAME="limitations">Limitations</A></H2>
  633. <P>Although <CODE>Set::IntSpan</CODE> can represent some infinite sets, 
  634. it does <EM>not</EM> perform infinite-precision arithmetic.  
  635. Therefore, 
  636. finite elements are restricted to the range of integers on your machine.</P>
  637. <P>
  638. <H2><A NAME="roots">Roots</A></H2>
  639. <P>The sets implemented here are based on a Macintosh data structure called 
  640. a <EM>region</EM>.
  641. See Inside Macintosh for more information.</P>
  642. <P>
  643. <HR>
  644. <H1><A NAME="author">AUTHOR</A></H1>
  645. <P>Steven McDougall, <A HREF="mailto:swmcd@world.std.com">swmcd@world.std.com</A></P>
  646. <P>
  647. <HR>
  648. <H1><A NAME="copyright">COPYRIGHT</A></H1>
  649. <P>Copyright 1996-1998 by Steven McDougall. This module is free
  650. software; you can redistribute it and/or modify it under the same
  651. terms as Perl itself.</P>
  652. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  653. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  654. <STRONG><P CLASS=block> Set::IntSpan - Manages sets of integers</P></STRONG>
  655. </TD></TR>
  656. </TABLE>
  657.  
  658. </BODY>
  659.  
  660. </HTML>
  661.