From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Copying string slices before calling subroutines?
Date: Sat, 5 May 2007 09:41:57 +0200
Date: 2007-05-05T09:41:22+02:00 [thread overview]
Message-ID: <1jz12blpydzq0.a66zm8kaza1d.dlg@40tude.net> (raw)
In-Reply-To: m2odl02phu.fsf@mac.com
On Fri, 04 May 2007 23:27:57 +0100, Simon Wright wrote:
> My reworking begins
>
> function Index
> (Source : String;
> Pattern : String;
> Going : Ada.Strings.Direction := Ada.Strings.Forward;
> Mapping : Ada.Strings.Maps.Character_Mapping
> := Ada.Strings.Maps.Identity) return Natural
> is
> Cur_Index : Natural;
> Potential_Match : Boolean;
> use Ada.Strings;
> use Ada.Strings.Maps;
> begin
> if Pattern = "" then
> raise Pattern_Error;
> end if;
>
> -- Forwards case
>
> if Going = Forward then
> for J in 1 .. Source'Length - Pattern'Length + 1 loop
> Cur_Index := Source'First + J - 1;
> Potential_Match := True;
> for K in Pattern'Range loop
> if Pattern (K) /=
> Value (Mapping, Source (Cur_Index + K - 1)) then
> Potential_Match := False;
> exit;
> end if;
> end loop;
> if Potential_Match then
> return Cur_Index;
> end if;
> end loop;
>
> which calls Ada.Strings.Maps.Value rather more often than I suppose it
> could.
You can save remapping of Source, just there is no need to do it in advance
and allocate a full copy of Source. Instead of that, you make a ring buffer
of mod Pattern'Length where you store Value (Mapping, Source (i)). Once you
advance the main string index you "rotate" the buffer.
Then Pattern'Length = 1 should be a special case, as well as identity
mapping. Though, I don't know how efficient the latter could be.
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
next prev parent reply other threads:[~2007-05-05 7:41 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-04-28 5:03 Reading and writing a big file in Ada (GNAT) on Windows XP Fionn Mac Cumhaill
2007-04-28 5:20 ` Gautier
2007-04-29 21:17 ` Fionn Mac Cumhaill
2007-04-28 5:25 ` tmoran
2007-04-28 6:56 ` Martin Krischik
2007-04-28 17:12 ` tmoran
2007-04-28 12:41 ` Jeffrey Creem
2007-04-29 21:35 ` Fionn Mac Cumhaill
2007-04-28 13:22 ` (see below)
2007-04-28 17:56 ` Simon Wright
2007-04-28 18:28 ` Jeffrey Creem
2007-04-29 7:20 ` Simon Wright
2007-04-29 21:44 ` Fionn Mac Cumhaill
2007-04-29 21:42 ` Fionn Mac Cumhaill
2007-04-30 0:48 ` Jeffrey R. Carter
2007-04-30 2:30 ` Fionn Mac Cumhaill
2007-04-30 4:21 ` tmoran
2007-04-28 19:12 ` Jeffrey R. Carter
2007-04-29 21:46 ` Fionn Mac Cumhaill
2007-05-01 14:10 ` Fionn Mac Cumhaill
2007-05-06 21:55 ` Quarc
2007-05-02 7:46 ` george
2007-05-03 6:31 ` Fionn Mac Cumhaill
2007-05-03 20:00 ` Simon Wright
2007-05-04 4:35 ` Jeffrey R. Carter
2007-05-04 4:45 ` Fionn Mac Cumhaill
2007-05-04 6:53 ` Alternative Index implementation? (Was: Reading and writing a big file in Ada (GNAT) on Windows XP) Jacob Sparre Andersen
2007-05-04 7:41 ` Dmitry A. Kazakov
2007-05-04 9:16 ` Copying string slices before calling subroutines? (Was: Alternative Index implementation?) Jacob Sparre Andersen
2007-05-04 9:44 ` Copying string slices before calling subroutines? Jacob Sparre Andersen
2007-05-04 10:14 ` Dmitry A. Kazakov
2007-05-04 12:07 ` Jeffrey Creem
2007-05-04 12:46 ` Dmitry A. Kazakov
2007-05-04 22:27 ` Simon Wright
2007-05-05 7:33 ` Jacob Sparre Andersen
2007-05-05 7:47 ` Dmitry A. Kazakov
2007-05-05 7:41 ` Dmitry A. Kazakov [this message]
2007-05-03 20:27 ` Reading and writing a big file in Ada (GNAT) on Windows XP Adam Beneschan
2007-05-03 23:01 ` Randy Brukardt
2007-05-04 0:28 ` Markus E Leypold
2007-05-05 16:26 ` Adam Beneschan
2007-05-05 17:27 ` Markus E Leypold
2007-05-15 23:03 ` Randy Brukardt
2007-05-04 20:04 ` Adam Beneschan
2007-05-05 16:36 ` tmoran
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox